ホームページ  >  記事  >  バックエンド開発  >  Pythonのasyncio共通関数の使い方は?

Pythonのasyncio共通関数の使い方は?

WBOY
WBOY転載
2023-04-26 20:10:061602ブラウズ

コルーチンの定義

async def ステートメントを使用する必要があります

コルーチンでできること:

1. 将来の結果を待ちます

2 、別のコルーチンを待ちます (結果を生成するか、例外を発生させます)

3. 待機しているコルーチンに結果を生成します

4. 待機しているコルーチンに例外をスローしますit プログラム

コルーチンの実行

コルーチン関数を呼び出します。コルーチンは実行を開始せず、コルーチン オブジェクトを返すだけです

コルーチンを実行するには 2 つの方法がありますオブジェクト メソッド:

1. await を使用して、すでに実行中の別のコルーチン

2. ensure_future 関数を通じて実行を計画します

特定のスレッドのループが実行されている場合にのみ、コルーチンを実行できます。

次の例:

まず、現在のスレッドのデフォルト ループを取得し、次に、コルーチン オブジェクトloop.run_until_complete に渡されると、コルーチン オブジェクトはループ内で実行されます

loop = asyncio.get_event_loop()
loop.run_until_complete(do_some_work(3))

run_until_complete はブロッキング呼び出しであり、コルーチンの実行が終了するまで戻りません

パラメーターは Future ですが、それに渡すのはコルーチン オブジェクトです。内部チェックが行われ、ensure_future 関数を通じてコルーチン オブジェクトを Future にラップします。

次のように記述できます:

loop.run_until_complete(asyncio.ensure_future(do_some_work(3)))

複数のコルーチンの実行

複数のコルーチンがループ内で実行されます。複数のコルーチンをループに渡すには、asyncio.gathre関数#を使用する必要があります。 ##

loop.run_until_complete(asyncio.gather(do_some_work(1), do_some_work(3)))

または、最初にコルーチン オブジェクトをリストに保存します。これがより一般的です。

loop = asyncio.get_event_loop() #获取当前线程loop
coros_list = []
for i in range(2000):
    coros_list.append(main(i))
loop.run_until_complete(asyncio.gather(*coros_list))

gather は集約の役割を果たし、複数の Future を 1 つの Future にパッケージ化します。これは、loop.run_until_complete が受け入れるのは一つの未来。

loop.close()について

簡単に言えば、ループが閉じられていない限り、ループは実行できます。 :

loop = asyncio.get_event_loop() #获取当前线程loop
loop.run_until_complete(do_some_work(loop, 1))
loop.run_until_complete(do_some_work(loop, 3))
loop.close()

ただし、閉じられている場合は実行できません:

loop = asyncio.get_event_loop() #获取当前线程loop
loop.run_until_complete(do_some_work(loop, 1))
loop.close()
loop.run_until_complete(do_some_work(loop, 3))  # 此处异常

Callback

コルーチンへの参加は IO 読み取り操作です。データの読み取りが完了すると、データのさらなる処理については通知を希望します。これは、future にコールバックを追加することで実現できます

def done_callback(futu):
    print('Done')
futu = asyncio.ensure_future(do_some_work(3))
futu.add_done_callback(done_callback)
loop.run_until_complete(futu)

イベント ループ

イベント ループは非同期タスクとコールバックを実行し、ネットワーク IO 操作を実行し、子プロセスを実行します

asyncio イベント ループから ポリシー文書では、イベント ループ ポリシーがプロセス内のすべてのイベント ループの管理を制御するプロセス グローバル オブジェクトであることがわかりました。

プロセスのグローバル ポリシーは、ポリシーによって制御されるコンテキストの意味を定義し、各コンテキストで個別のイベント ループを管理します。デフォルト ポリシーによって定義されたコンテキストは現在のスレッドです。つまり、異なるスレッドが存在します。コンテキストが異なると、イベント ループも異なります。

イベント ループを取得します

asyncio.get_running_loop() # 返回当前os线程中正在运行的事件循环
asyncio.get_event_loop() # 获取当前事件循环
asyncio.set_event_loop(loop) # 获取当前事件循环
asyncio.new_event_loop() # 创建并返回一个新的事件循环对象

asyncio.get_event_loop()

If:

  • 現在のスレッドはメイン スレッドです

  • 現在のスレッドはイベント ループを開始していません

asyncio.get_event_loop() メソッドを呼び出すと、新しいデフォルト イベントが生成されますループして、現在のスレッドのイベント ループに設定します。

現時点では、get_event_loop() は次と同等です:

loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)

以上がPythonのasyncio共通関数の使い方は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。