【发布时间】:2019-12-18 09:20:15
【问题描述】:
在我制作的另一个使用 asyncio 的程序中,我遇到了以下问题:
在一个函数中,等待两个协程(在不同的行上),但是第一个需要一些时间,在第一个协程完成之前,另一个函数被调用等待另一个协程,因为这是在第一个完成之前等待,第二个第一个函数的协程还没有等待,所以第二个函数在第一个的两个协程之间运行
我的解决方案是创建某种全局队列来添加协程,这样运行时间就不会影响顺序,我做了一个小测试,但无法让它正常工作。
我尝试使用 while not 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 秒后。
【问题讨论】:
标签: python python-3.x queue python-asyncio