目次
1. コルーチン関数を作成する
2. コルーチン関数を呼び出す
例: コルーチン関数を通じてコルーチン関数を呼び出す
例: IOLoo が起動していない場合は、IOLoop の run_sync() 関数を通じて呼び出します。
プログラムが IOLoop の実行状態に入っていない場合、run_sync() 関数を通じてコルーチン関数を呼び出すことができます。 " >プログラムが IOLoop の実行状態に入っていない場合、run_sync() 関数を通じてコルーチン関数を呼び出すことができます。
例: IOLoop が開始されるとき、spawn_callback() 関数を介して呼び出します" >例: IOLoop が開始されるとき、spawn_callback() 関数を介して呼び出します
3. コルーチンでのブロック関数の呼び出し
4. コルーチン内で複数の非同期呼び出しを待機する
例: list メソッドを使用して複数の非同期呼び出しを渡す" >例: list メソッドを使用して複数の非同期呼び出しを渡す
例: 辞書モードで複数の非同期呼び出しを渡す: " >例: 辞書モードで複数の非同期呼び出しを渡す:
ホームページ バックエンド開発 Python チュートリアル Python での Tornado コルーチンの使用方法の詳細な説明 (例付き)

Python での Tornado コルーチンの使用方法の詳細な説明 (例付き)

Oct 16, 2018 pm 04:03 PM
python

この記事では、Python での Tornado コルーチンの使用方法を詳しく説明します (例を示します)。これには一定の参考価値があります。必要な友人は参照できます。お役に立てば幸いです。

Tornado コルーチンを使用すると、同期コードと同様の非同期動作を開発できます。同時に、コルーチン自体はスレッドを使用しないため、スレッドのコンテキスト切り替えのオーバーヘッドが軽減され、効率的な開発モデルとなります。

1. コルーチン関数を作成する

例: コルーチン テクノロジを使用した Web ページ アクセス関数の開発

#用协程技术开发网页访问功能
from tornado import  gen #引入协程库gen
from tornado.httpclient import AsyncHTTPClient
import time

#使用gen.coroutine修饰器
@gen.coroutine
def coroutine_visit():
    http_client=AsyncHTTPClient()
    response=yield http_client.fetch("http://www.baidu.com")
    print(response.body)
ログイン後にコピー

この例では、ページ アクセスに非同期クライアント AsyncHTTPClient が引き続き使用されます。デコレータ @gen.coroutine は、これがコルーチン関数であることを宣言します。 yield キーワードがあるため、アクセス結果を処理するためにコード内にコールバック関数を記述する必要はありません。代わりに、結果処理ステートメントを、利回りステートメント。

2. コルーチン関数を呼び出す

Tornado コルーチンは Python の yield キーワードに基づいて実装されているため、通常の関数のように直接呼び出すことはできません。
コルーチン関数は、次の 3 つの方法で呼び出すことができます。

  • それ自体がコルーチンである関数内で、yield キーワードを介して呼び出されます。

  • IOLoop が起動していない場合は、IOLoop の run_sync() 関数を通じて呼び出します。

  • IOLoop が開始されると、IOLoop の spawn_callback() 関数を通じて呼び出されます。

例: コルーチン関数を通じてコルーチン関数を呼び出す

コード:

#用协程技术开发网页访问功能
from tornado import  gen #引入协程库gen
from tornado.httpclient import AsyncHTTPClient
import time

#使用gen.coroutine修饰器
@gen.coroutine
def coroutine_visit():
    http_client=AsyncHTTPClient()
    response=yield http_client.fetch("http://www.baidu.com")
    print(response.body)

@gen.coroutine
def outer_coroutine():
    print("start call coroutine_visit")
    yield coroutine_visit()
    print("end call coroutine_cisit")
ログイン後にコピー

この例では、outer_coroutine() と coroutine_visit() は両方ともコルーチン関数 プログラム関数。yield キーワードを通じて呼び出すことができます。 __

例: IOLoo が起動していない場合は、IOLoop の run_sync() 関数を通じて呼び出します。
IOLoop は Tornado のメイン イベント ループ オブジェクトであり、Tornado プログラムはこれを通じて外部クライアントからのアクセス要求をリッスンし、対応する操作を実行します。

コード:

#用协程技术开发网页访问功能
from tornado import  gen #引入协程库gen
from tornado.httpclient import AsyncHTTPClient
from tornado.ioloop import IOLoop  #引入IOLoop对象

#使用gen.coroutine修饰器
@gen.coroutine
def coroutine_visit():
    http_client=AsyncHTTPClient()
    response=yield http_client.fetch("http://www.baidu.com")
    print(response.body)

def func_normal():
    print("start call coroutine_visit")
    IOLoop.current().run_sync(lambda :coroutine_visit())
    print("end call coroutine_visit")
ログイン後にコピー
プログラムが IOLoop の実行状態に入っていない場合、run_sync() 関数を通じてコルーチン関数を呼び出すことができます。

注: run_sync() 関数は、呼び出されたコルーチンの実行が完了するまで、現在の関数の呼び出しをブロックします。

実際、Tornado では IOLoop の実行状態でコルーチン関数を呼び出すことができる必要がありますが、run_sync 関数は IOLoop の開始と停止のステップを自動的に完了します。その実装ロジックは次のとおりです:

[IOLoop を開始する]》[ラムダによってカプセル化されたコルーチン関数を呼び出す]》[IOLoop を停止する]

例: IOLoop が開始されるとき、spawn_callback() 関数を介して呼び出します

コード:

#用协程技术开发网页访问功能
from tornado import  gen #引入协程库gen
from tornado.httpclient import AsyncHTTPClient
from tornado.ioloop import IOLoop  #引入IOLoop对象

#使用gen.coroutine修饰器
@gen.coroutine
def coroutine_visit():
    http_client=AsyncHTTPClient()
    response=yield http_client.fetch("http://www.baidu.com")
    print(response.body)

def func_normal():
    print("start call coroutine_visit")
    IOLoop.current().spawn_callback(coroutine_visit)
    print("end call coroutine_visit")
ログイン後にコピー

spawn_callback() 関数は、呼び出されたコルーチンの実行が完了するまで待機しません。上位および下位のすべての print ステートメントはすぐに完了し、coroutine__visit 自体は次の時点で IOLoop によって呼び出されます。適切な時期。

注: IOLoop の spawn_callback() 関数は、コルーチン関数呼び出しの戻り値を取得するメソッドを開発者に提供しないため、span_callback() は戻り値のないコルーチン関数を呼び出すためにのみ使用できます。

3. コルーチンでのブロック関数の呼び出し

コルーチンでブロック関数を直接呼び出すと、コルーチン自体のパフォーマンスに影響を与えるため、Tornado ではスレッド プールを使用して、コルーチンでブロック関数をスケジュールすることができます。したがって、コルーチン自体の継続的な実行に影響を与えないメソッドです。

コード例:

from concurrent.futures import ThreadPoolExecutor
from tornado import gen

#定义线程池
thread_pool=ThreadPoolExecutor(2)

def mySleep(count):
    import time
    for x in range(count):
        time.sleep(1)

@gen.coroutine
def call_blocking():
    print("start")
    yield thread_pool.submit(mySleep,10)
    print("end")
ログイン後にコピー

コードは、最初に concurrent.futures の ThreadPoolExecutor クラスを参照し、2 つのスレッドで構成されるスレッド プール thread_pool をインスタンス化します。ブロッキング関数を呼び出す必要があるコルーチン call_blocking では、thread_pool.submit を使用してブロッキング関数を呼び出し、yield を通じてそれを返します。これにより、コルーチンが配置されているスレッドの継続的な実行がブロックされず、ブロック関数の前後のコードの実行順序も保証されます。

4. コルーチン内で複数の非同期呼び出しを待機する

これまでのところ、コルーチン内で yield キーワードを使用して非同期呼び出しを待機するプログラミング方法がわかりました。実際、Tornado では、コルーチンで yield キーワードを使用して複数の非同期呼び出しを待機することができ、これらの呼び出しをリストまたは辞書の形式で yield キーワードに渡すだけで済みます。
例: list メソッドを使用して複数の非同期呼び出しを渡す
#使用列表方式传递多个异步调用
from tornado import gen  #引入协程库gen
from tornado.httpclient import AsyncHTTPClient

@gen.coroutine   #使用gen.coroutine修饰器
def coroutine_visit():
    http_client=AsyncHTTPClient()
    list_response=yield [
        http_client.fetch("http://www.baidu.com"),
        http_client.fetch("http://www.api.jiutouxiang.com")
    ]
    for response in list_response:
        print(response.body)
ログイン後にコピー

引き続き @gen.coroutine デコレータを使用してコード内でコルーチンを定義し、yield が必要な場所にリストを使用していくつかの呼び出しを渡します非同期呼び出しである yield は、リスト内のすべての呼び出しが完了した後にのみ戻り、実行を継続します。 yield は呼び出し結果をリストで返します。

例: 辞書モードで複数の非同期呼び出しを渡す:
#使用列表方式传递多个异步调用
from tornado import gen  #引入协程库gen
from tornado.httpclient import AsyncHTTPClient

@gen.coroutine   #使用gen.coroutine修饰器
def coroutine_visit():
    http_client=AsyncHTTPClient()
    dict_response=yield {
       "baidu": http_client.fetch("http://www.baidu.com"),
        "9siliao":http_client.fetch("http://www.api.jiutouxiang.com")
    }
    print(dict_response["baidu"].body)
ログイン後にコピー

以上がPython での Tornado コルーチンの使用方法の詳細な説明 (例付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHPおよびPython:さまざまなパラダイムが説明されています PHPおよびPython:さまざまなパラダイムが説明されています Apr 18, 2025 am 12:26 AM

PHPは主に手順プログラミングですが、オブジェクト指向プログラミング(OOP)もサポートしています。 Pythonは、OOP、機能、手続き上のプログラミングなど、さまざまなパラダイムをサポートしています。 PHPはWeb開発に適しており、Pythonはデータ分析や機械学習などのさまざまなアプリケーションに適しています。

PHPとPythonの選択:ガイド PHPとPythonの選択:ガイド Apr 18, 2025 am 12:24 AM

PHPはWeb開発と迅速なプロトタイピングに適しており、Pythonはデータサイエンスと機械学習に適しています。 1.PHPは、単純な構文と迅速な開発に適した動的なWeb開発に使用されます。 2。Pythonには簡潔な構文があり、複数のフィールドに適しており、強力なライブラリエコシステムがあります。

Python vs. JavaScript:学習曲線と使いやすさ Python vs. JavaScript:学習曲線と使いやすさ Apr 16, 2025 am 12:12 AM

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

PHPとPython:彼らの歴史を深く掘り下げます PHPとPython:彼らの歴史を深く掘り下げます Apr 18, 2025 am 12:25 AM

PHPは1994年に発信され、Rasmuslerdorfによって開発されました。もともとはウェブサイトの訪問者を追跡するために使用され、サーバー側のスクリプト言語に徐々に進化し、Web開発で広く使用されていました。 Pythonは、1980年代後半にGuidovan Rossumによって開発され、1991年に最初にリリースされました。コードの読みやすさとシンプルさを強調し、科学的コンピューティング、データ分析、その他の分野に適しています。

Windows 8でコードを実行できます Windows 8でコードを実行できます Apr 15, 2025 pm 07:24 PM

VSコードはWindows 8で実行できますが、エクスペリエンスは大きくない場合があります。まず、システムが最新のパッチに更新されていることを確認してから、システムアーキテクチャに一致するVSコードインストールパッケージをダウンロードして、プロンプトとしてインストールします。インストール後、一部の拡張機能はWindows 8と互換性があり、代替拡張機能を探すか、仮想マシンで新しいWindowsシステムを使用する必要があることに注意してください。必要な拡張機能をインストールして、適切に動作するかどうかを確認します。 Windows 8ではVSコードは実行可能ですが、開発エクスペリエンスとセキュリティを向上させるために、新しいWindowsシステムにアップグレードすることをお勧めします。

Visual StudioコードはPythonで使用できますか Visual StudioコードはPythonで使用できますか Apr 15, 2025 pm 08:18 PM

VSコードはPythonの書き込みに使用でき、Pythonアプリケーションを開発するための理想的なツールになる多くの機能を提供できます。ユーザーは以下を可能にします。Python拡張機能をインストールして、コードの完了、構文の強調表示、デバッグなどの関数を取得できます。デバッガーを使用して、コードを段階的に追跡し、エラーを見つけて修正します。バージョンコントロールのためにGitを統合します。コードフォーマットツールを使用して、コードの一貫性を維持します。糸くずツールを使用して、事前に潜在的な問題を発見します。

メモ帳でPythonを実行する方法 メモ帳でPythonを実行する方法 Apr 16, 2025 pm 07:33 PM

メモ帳でPythonコードを実行するには、Python実行可能ファイルとNPPEXECプラグインをインストールする必要があります。 Pythonをインストールしてパスを追加した後、nppexecプラグインでコマンド「python」とパラメーター "{current_directory} {file_name}"を構成して、メモ帳のショートカットキー「F6」を介してPythonコードを実行します。

ターミナルVSCODEでプログラムを実行する方法 ターミナルVSCODEでプログラムを実行する方法 Apr 15, 2025 pm 06:42 PM

VSコードでは、次の手順を通じて端末でプログラムを実行できます。コードを準備し、統合端子を開き、コードディレクトリが端末作業ディレクトリと一致していることを確認します。プログラミング言語(pythonのpython your_file_name.pyなど)に従って実行コマンドを選択して、それが正常に実行されるかどうかを確認し、エラーを解決します。デバッガーを使用して、デバッグ効率を向上させます。

See all articles