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
相关产品推荐
相关产品推荐

