各タスクは別のスレッドで起動されますか?
いいえ、通常asyncioはシングルスレッドで動作します。
これらの キーワードを使用して、asyncioパッケージでbarを非同期タスクにする方法この関数は__next__()
メソッドを使用して、「手順によって」それを実行することができますどのような発電機となりasync
としてあなたが関数を定義
。 await
- 実際にyield
(yield from
)ポイントです。実行フローはすべてのコルーチンの実行を管理するグローバルイベントループに戻ります。
この単純な例では、あなたが別のジェネレータの実行の流れを切り替えることができます方法を示しています。
def task(i):
yield 1
print('task {}: step 1'.format(i))
yield 2
print('task {}: step 2'.format(i))
tasks = [
task(1),
task(2),
task(3),
]
def execute_tasks(tasks):
i = 0
finished = []
while True:
# start executing tasks:
try:
tasks[i].__next__()
except StopIteration:
finished.append(i)
# check if any task unfinished:
if len(finished) == len(tasks):
return
# move to next unfinished task:
while True:
i += 1
if i > len(tasks) - 1:
i = 0
if not i in finished:
break
if __name__ == '__main__':
execute_tasks(tasks)
出力:
task 1: step 1
task 2: step 1
task 3: step 1
task 1: step 2
task 2: step 2
task 3: step 2
asyncio
もちろんはるかに複雑で、あなたにはるかにすることができます。
このPyCon 2015ビデオで見たジェネレータを使用してコルーチンを実装する方法については、おそらく最も良い説明はDavid Beazley - Python Concurrency From the Ground Up: LIVE!(source code)です。あなたがこれを実装しようとしているなら、間違いなくそれを見るべきです。
代わりにasyncio
を使用するようアドバイスします。既にあなたのために存在しています。あなた自身を発明する必要はありません。
[Brett Cannonの記事](https://snarky.ca/how-the-heck-does-async-await-work-in-python-3-5/)については、非同期/待機用のボンネットの下にあるもの。非常に深いですが、S/Oで簡単にカバーできるトピックではありません。 – Gavin