在另一个程序中,我做了使用异步的操作,我不得不解决以下问题:
在一个函数中,等待两个协同线(在不同的行上),但是第一个协同线需要一些时间,在第一个coroutine完成之前,另一个函数被称为等待另一个协同线的函数,因为这是在第一个完成之前等待的,第一个函数的第二个协同线还没有等待,所以第二个函数在第一个coroutine的两个coroutine之间运行。
我的解决方案是创建某种全局队列,将协同器添加到其中,这样运行时不会影响订单,我做了一个小测试,但无法使它正常工作。
我尝试使用了一段时间而不是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同时完成,然后在2秒后完成。
发布于 2019-08-13 01:45:24
您的示例同时运行所有三个任务的原因是,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
https://stackoverflow.com/questions/57450276
复制相似问题