Python3は長い間発売されており、日常の機能について学ぶ時間がありませんでした。今回は公式ドキュメントに従ってそれについて学びます。
Pythonバージョン:3.6.6
import asyncio
async def hello_world():print("Hello World!")
loop = asyncio.get_event_loop()
loop.run_until_complete(hello_world())
loop.close()
実際には、関数の通常の実行と大きな違いはありません。
公式の紹介によると、ここでのルーチンはタスクを介して行われるため、ここで「ループ」を定義する必要があります。この「ループ」は、着信関数の実行ステータスを監視します。実行が完了したら、 loop
をオフにします。
実際、 Python3.8
はasyncio.run()
に変更されました。このメソッドは実際にはよりユーザーフレンドリーであり、基本的にはコルティンの実装方法を認識しません。
import asyncio
async def slow_operation(future):await asyncio.sleep(1)
future.set_result('Future is done!')
loop = asyncio.get_event_loop()
future = asyncio.Future()
asyncio.ensure_future(slow_operation(future))
loop.run_until_complete(future)print(future.result())
loop.close()
ご覧のとおり、これは実際には Future
を定義することで実現されます。非同期関数が実行された後、結果は set_result
メソッドによって設定されます。この結果は外層で得ることができます。このようにして、同期的な考え方で非同期プログラムを作成し、返された結果を取得できます。
import asyncio
async def slow_operation():await asyncio.sleep(1)return'Future is done!'
def got_result(future):print(future.result())
loop = asyncio.get_event_loop()
task = asyncio.ensure_future(slow_operation())
task.add_done_callback(got_result)
loop.run_until_complete(task)
loop.close()
ここでの例は、私が公式の例で変更したもので、理解しやすいです。ここでのコールバックは Future
オブジェクトにスローされます。このオブジェクトのメソッドを介して結果を取得します。
import asyncio
import time
async def factorial(name, number):
f =1for i inrange(2, number+1):print("Task %s: Compute factorial(%s)..."%(name, i))await asyncio.sleep(1)
f *= i
print("Task %s: factorial(%s) = %s"%(name, number, f))
loop = asyncio.get_event_loop()print(time.time())
loop.run_until_complete(asyncio.gather(factorial("A",2),factorial("B",2),factorial("C",2),))print(time.time())
loop.close()
ここでは「gather」メソッドを紹介します。この同形性の方法は、同時に複数のタスクを実行できます。
上記のコードの公式コンテンツを変更しました。実行結果を見ることができます。これらの3つのタスクは、実際には同時に実行されます。関数の実行時間全体はわずか1秒です。それは並行性を達成することです。
公式ドキュメントの例は、実際には、ループがすべてのタスクが完了するのを待ってから終了することを示しています。
A task is automatically scheduled for execution when it is created. The event loop stops when all tasks are done.
このコンテンツを読みながら、 time.sleep(1)
と await asyncio.sleep(1)
の違いを考えていました。
awaitを使用すると、この部分に遭遇したときにコルチンがコンテキストを切り替えます。awaitを使用しない場合、常にブロックされます。これは、待機が実用的でない場合を意味します。 。 。並行性は誤った提案です。
上記のマルチタスク実行例では、 await asyncio.sleep(1)
を time.sleep(1)
に変更します。これらの3つのタスクは連続していることがわかります。
https://hackernoon.com/threaded-asynchronous-magic-and-how-to-wield-it-bba9ed602c32
https://docs.python.org/zh-cn/3.6/library/asyncio-task.html
Recommended Posts