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

如何同时运行含异步函数的类的多个实例?代码阻塞问题求解

问题解决:多进程运行异步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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 17:43:15