簡體   English   中英

Python Asyncio如何從隊列連續運行任務/協程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM