aiomultiprocess:Worker创建两个进程而非一个的问题咨询
问题:aiomultiprocess Worker初始化时意外生成进程?
我参考aiomultiprocess官方用户指南编写了测试代码,通过psutil监控Python进程数:
import asyncio import psutil import multiprocessing from aiomultiprocess import Worker from time import sleep def check_process_count(): python_procs = [p for p in psutil.process_iter(attrs=["pid", "name"]) if "python" in p.info["name"]] print(f"Active Python-Processes: {[p.info['pid'] for p in python_procs]}") async def wait(): print('Wait 5') sleep(5.0) return('123') async def program1(): check_process_count() myprocess = Worker(target=wait, ) check_process_count() print('myprocess = Worker(target=wait, )') myprocess.start() print('myprocess.start()') check_process_count() print(await myprocess.join()) print('await myprocess.join()') if __name__ == "__main__": asyncio.run(program1())
测试输出显示生成了两个新进程:
(test) ludger@lhnotebook:~/safe/sources/python/test$ python test.py Active Python-Processes: [7585] Active Python-Processes: [7585, 7586] myprocess = Worker(target=wait, ) myprocess.start() Wait 5 Active Python-Processes: [7585, 7586, 7592] 123 await myprocess.join()
其中第一个进程在Worker初始化时生成,不符合我对文档的预期;第二个在调用start()时生成属于正常情况,想知道这个现象背后的误解点是什么。
分析与解答
你对aiomultiprocess Worker的行为误解,核心在于混淆了它和标准库multiprocessing.Process的启动逻辑:
- 标准库
Process确实是在调用start()时才会创建子进程,但aiomultiprocess的Worker为了适配异步任务的执行,在初始化阶段就会创建一个辅助子进程,用于提前搭建异步运行环境(比如初始化asyncio事件循环),确保目标异步函数能在正确的环境中执行。 - 你看到的初始化后出现的进程(7586)就是这个辅助进程,它会在后台准备异步运行时;当调用
start()时,Worker才会真正启动执行目标函数的工作进程(7592)。 - 这种设计是aiomultiprocess为了让异步任务能在多进程环境中高效运行而做的底层优化,和标准多进程的行为逻辑不同,这也是你产生预期偏差的原因。
内容的提问来源于stack exchange,提问作者LudgerH
相关产品推荐
相关产品推荐

