是否每個任務都在單獨的線程上啓動?
不,通常asyncio在單線程中運行。
asyncio軟件包如何使用這些 關鍵字使欄成爲異步任務?
當你定義功能async
這個功能變得發生器就是允許「的步驟」使用__next__()
方法來執行它。 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