但還是搞不清楚asyncio.sleep()之後程式執行的順序,於是自己設計了兩個sample tasks
import asyncio
import time
async def print_even_numbers():
for i in range(0, 20, 2):
print(i)
print(f"task1_time: {time.time()}")
await asyncio.sleep(0.5)
return i
async def print_odd_numbers():
for i in range(1, 20, 2):
print(i)
print(f"task2_time: {time.time()}")
await asyncio.sleep(1)
return i
async def main():
task1 = asyncio.create_task(print_even_numbers())
task2 = asyncio.create_task(print_odd_numbers())
value1 = await task1
value2 = await task2 print(f"value2: {value2}")
print(f"value1: {value1}")
asyncio.run(main())
基本邏輯是:async def 一碰到 await 就會忍不住(?)去下一個 async def 執行。 task1 印偶數, task2 印奇數,印完之後印 Unix 时间。兩個tasks 不同的是印偶數的印完數字後休息 0.5s /次,而印奇數的印完數字後休息 1s / 次,最後在 await task1 和 await task2 等待 task 執行完回傳 i (最後一個印的數字)。
輸出的結果如下:
0
task1_time: 1645929064.624109
1
task2_time: 1645929064.6241448
2
task1_time: 1645929065.1246579
3
task2_time: 1645929065.624295
4
task1_time: 1645929065.624743
6
task1_time: 1645929066.1249878
5
task2_time: 1645929066.624856
8
task1_time: 1645929066.625101
10
task1_time: 1645929067.1263502
7
task2_time: 1645929067.6258502
12
task1_time: 1645929067.6265988
14
task1_time: 1645929068.127417
9
task2_time: 1645929068.6269782
16
task1_time: 1645929068.627622
18
task1_time: 1645929069.128748
11
task2_time: 1645929069.628264
13
task2_time: 1645929070.629112
15
task2_time: 1645929071.629953
17
task2_time: 1645929072.630785
19
task2_time: 1645929073.63198
value2: 19
value1: 18
可以看到:
0, 1 幾乎同時,也就是說 task1 一 asyncio.sleep 就執行 task2,然後,task2 一 asyncio.sleep 就執行 task1印出 2,兩者只間隔 0.00003s ,以此類推……(才怪
最明顯的就是偶數很快就印完了,而奇數還在後面慢慢印,這是因為 task1 和 task2 的 sleep 時間不一樣, 所以並不是剛好 “輪流” 執行,順序其實是:0, 1, 2, 3, 4, 6, 5, 8, 10, 7, 12, 14, 9, …….
這是因為 task1 每印一次數字就休息 0.5s ,而 task2 則是 1s。(就像以前的植樹問題一樣,同樣距離下,每兩公里種一棵樹的、一定比每一公里種一棵樹的早種完。)
有空的話再來研究 asyncio.gather 和 asyncio.get_event_loop() 以及 loop.run_until_complete 吧 QQQQQQQQQ 雖然這對工作上來說可能太慢了…
如有需要引用請註明來源即可