如何同时运行含异步函数的类的多个实例?代码阻塞问题求解
问题解决:多进程运行异步Python实例
你的代码核心问题是创建子进程时提前执行了异步函数,导致主进程被阻塞,无法启动第二个子进程。
错误原因
当你写p1 = multiprocessing.Process(target=asyncio.run(a.starter()))时,asyncio.run(a.starter())会在主进程创建子进程前就直接执行,而starter方法里是无限循环的协程,主进程直接被这个调用卡住,根本没机会创建并启动p2进程。
修正后的代码
方式一:使用lambda包装异步调用
import asyncio import multiprocessing class calculation(): def __init__(self, value): self.value = value async def one(self): while True: print(self.value * 1) await asyncio.sleep(1) async def two(self): while True: print(self.value * 2) await asyncio.sleep(1) async def starter(self): await asyncio.gather(self.one(), self.two()) if __name__ == '__main__': a = calculation(2) b = calculation(3) # 使用lambda把异步调用包装成可调用对象,子进程启动后才会执行 p1 = multiprocessing.Process(target=lambda: asyncio.run(a.starter())) p2 = multiprocessing.Process(target=lambda: asyncio.run(b.starter())) p1.start() p2.start() # 可选:如果需要等待子进程结束,可加上join # p1.join() # p2.join()
方式二:定义单独的包装函数(更清晰,适合复杂场景)
import asyncio import multiprocessing class calculation(): def __init__(self, value): self.value = value async def one(self): while True: print(self.value * 1) await asyncio.sleep(1) async def two(self): while True: print(self.value * 2) await asyncio.sleep(1) async def starter(self): await asyncio.gather(self.one(), self.two()) # 定义包装函数,接收calculation实例并运行其异步方法 def run_calculation(calc_instance): asyncio.run(calc_instance.starter()) if __name__ == '__main__': a = calculation(2) b = calculation(3) p1 = multiprocessing.Process(target=run_calculation, args=(a,)) p2 = multiprocessing.Process(target=run_calculation, args=(b,)) p1.start() p2.start()
补充说明
- 两种方式都能实现两个
calculation实例在独立进程中同时运行,各自执行内部的异步协程 - 如果是在Windows系统下运行,必须保证
multiprocessing相关代码在if __name__ == '__main__':块内,否则会出现进程创建异常(你的代码已经满足这个要求)
内容的提问来源于stack exchange,提问作者Abcd
相关产品推荐
相关产品推荐

