あなたの質問に答えるために私はあなたが求めているものの多くを含めるために、asyncioドキュメントの例の1つを修正しました。 https://docs.python.org/3/library/asyncio-task.html
import asyncio
result2 = 0
async def compute(x, y):
print("Compute %s + %s ..." % (x, y))
await asyncio.sleep(1.0)
result2 = x*y
return x + y
async def print_sum(x, y):
result = await compute(x, y)
print("%s + %s = %s" % (x, y, result))
async def dosomethingelse():
print("I've got a lovely bunch of coconuts")
loop = asyncio.get_event_loop()
tasks = [print_sum(1, 2),
dosomethingelse(),
compute(2, 4)
]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
print(result2)
あなたがあなたの上に実行する場合、計算が待っている間、そのdosomethingelseは、実行されるはずです。
私は、非同期プログラミングが本当に難しいと感じました。しかし、asyncioは実際にはすべてが同じメモリ空間で実行され、(このような単純なコルーチンの場合)プログラムフローが完全にシーケンシャルなので、スレッドまたはマルチプロセッシングよりもはるかに簡単だと思います。最初のタスクはawait
に達するまで実行され、次のタスクにはチャンスが与えられます。モジュールのドキュメントを読むことを強くお勧めします。これは非常に優れており、各トピックを探るためのいくつかの例を書こうとしています。コルーチンから始め、連鎖してコールバックします。
編集:私はこれを良い単純な例だと思ってここに残します。あなたが同意しないとコメントする。 yield from
の構文は、私が少し古いバージョンのpython 3を使っていたためです。
私が読んでいたチュートリアルは覚えていませんが、私が書いた最初のasyncioテストの1つです。あなたの質問に固執する
import asyncio
@asyncio.coroutine
def my_coroutine(task_name, seconds_to_sleep=3):
print("{0} sleeping for: {1} seconds".format(task_name, seconds_to_sleep))
yield from asyncio.sleep(seconds_to_sleep)
print("{0} is finished".format(task_name))
loop = asyncio.get_event_loop()
tasks = [my_coroutine("task1", 4),
my_coroutine("task2", 2),
my_coroutine("task3", 10)]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
あなたが本当にそれを自分で書きたい場合は、ない誰かあなたはSOコミュニティから、[asyncio](https://docs.python.org/3/library/asyncio.html)のPythonドキュメントを読むことができます – agg3l