You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python asyncio多任务无法正常运行问题求助

问题分析与解决方案

你的代码问题出在事件循环提前退出:asyncio.run()会等待传入的协程(这里是background_tasks)执行完毕后立即关闭事件循环,而background_tasks仅仅创建了两个任务就直接结束了,没有等待这些任务完成。这导致func2的await asyncio.sleep(2)还未执行完成,Worker的无限循环还没启动,事件循环就被终止,进程直接退出。

修复方案

方案1:等待所有任务完成(适合需要保持worker持续运行的场景)

修改background_tasks,让它等待创建的任务完成。由于func1中的Worker.start()是无限循环,程序会一直运行直到被手动终止:

async def background_tasks():
    task1 = asyncio.create_task(func1())
    task2 = asyncio.create_task(func2())
    # 等待两个任务完成(task1会无限运行,所以程序不会自动退出)
    await asyncio.gather(task1, task2)

方案2:等待func2完成后保持worker运行

如果希望func2完成后,worker继续运行,可在func2完成后添加无限等待:

async def background_tasks():
    asyncio.create_task(func1())
    await func2()
    # 通过等待一个永远不会触发的事件,让事件循环持续运行
    await asyncio.Event().wait()

补充:Worker类的潜在问题

确保你的Worker.start()方法正确实现了从asyncio.Queue获取数据的逻辑,比如:

import asyncio

class Worker:
    def __init__(self, queue: asyncio.Queue, name: str):
        self.queue = queue
        self.name = name

    async def start(self):
        while True:
            try:
                # 非阻塞获取队列元素,队列为空时立即返回None
                item = self.queue.get_nowait()
                print(f"{self.name} printing object: {item}")
                self.queue.task_done()
            except asyncio.QueueEmpty:
                print(f"{self.name} waiting")
            # 加个小延迟避免CPU占用过高
            await asyncio.sleep(0.1)

修复后预期输出

修改后你会得到类似预期的输出:

Running func1...
Running func2...
worker1 waiting
worker2 waiting
worker3 waiting
...
func2 done...
worker1 waiting
worker2 printing object: xxx
...

内容的提问来源于stack exchange,提问作者nonemaw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 16:26:28