首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python如何从队列中连续运行任务/协作

Python如何从队列中连续运行任务/协作
EN

Stack Overflow用户
提问于 2019-08-11 13:20:47
回答 1查看 1.2K关注 0票数 2

在另一个程序中,我做了使用异步的操作,我不得不解决以下问题:

在一个函数中,等待两个协同线(在不同的行上),但是第一个协同线需要一些时间,在第一个coroutine完成之前,另一个函数被称为等待另一个协同线的函数,因为这是在第一个完成之前等待的,第一个函数的第二个协同线还没有等待,所以第二个函数在第一个coroutine的两个coroutine之间运行。

我的解决方案是创建某种全局队列,将协同器添加到其中,这样运行时不会影响订单,我做了一个小测试,但无法使它正常工作。

我尝试使用了一段时间而不是co.done()循环,但它似乎只有在任务完成后才能解决。

我尝试在循环之外执行它,但出于某种原因,它只使用一个q.get()完成了所有的任务

代码语言:javascript
运行
复制
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秒后完成。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-13 01:45:24

您的示例同时运行所有三个任务的原因是,asyncio.create_task()在将它们从队列中弹出并await之前就计划运行协同任务。如果我正确理解,这里对asyncio.create_task()的调用是不必要的(就像对asyncio.wait()的调用一样)。您可以这样简单地重构您的main()函数,它将按FIFO顺序运行任务,每次只运行一个任务:

代码语言:javascript
运行
复制
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
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57450276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档