[英]How to run tasks concurrently from a list in asyncio? (Python 3.7 and above)
[英]Python Asyncio how to run Tasks/Coroutines Consecutively from a Queue
在我制作的利用異步的另一個程序中,我不得不遇到以下問題:
在一個函數中,要等待兩個協程(在單獨的行上),但是第一個協程需要花費一些時間,在第一個協程完成之前,調用另一個函數來等待另一個協程,因為這是在第一個協程完成之前等待的,它是第二個協程尚未等待第一個函數,因此第二個函數在第一個的兩個協程之間運行
我的解決方案是制作一些將添加協程的全局隊列,這樣運行時就不會影響訂單,我做了一個小測試,但不能使其正常工作。
我嘗試使用了一段時間而不是co.done()循環,但是它似乎只能在任務完成后解決
我嘗試在循環外執行此操作,但是由於某種原因,它僅用一個q.get()就完成了所有任務。
import asyncio
from time import gmtime, strftime
async def task(name, time, queue=None):
print(strftime("%H:%M:%S", gmtime()))
await asyncio.sleep(time)
print("task %s done"%(name))
print(strftime("%H:%M:%S", gmtime()))
if queue:
queue.task_done()
async def main():
q = asyncio.Queue()
await q.put(asyncio.create_task(task("A", 3, q)))
await q.put(asyncio.create_task(task("B", 1, q)))
await q.put(asyncio.create_task(task("C", 1, q)))
for i in range(3):
co = await q.get()
done, pending = await asyncio.wait({co})
asyncio.run(main())
我期望它可以一次又一次地完成所有任務,因此總時間為5秒。 但是它會在3秒內同時運行它們,B和C首先同時完成,然后A在2秒后完成。
您的示例同時運行所有三個任務的原因是因為asyncio.create_task()
安排協程運行,甚至在您將協程彈出隊列並await
它們之前也是如此。 如果我理解正確的話,調用asyncio.create_task()
這里是不必要的(因為是調用asyncio.wait()
您可以像這樣簡單地重構main()
函數,它將以FIFO順序運行任務,並且一次只能運行一個任務:
async def main():
q = asyncio.Queue()
await q.put(task("A", 3, q))
await q.put(task("B", 1, q))
await q.put(task("C", 1, q))
for i in range(3):
co = await q.get()
await co
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.