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

Python多进程target内使用while循环无法并行执行问题

问题根因

创建Process实例时target参数的传参写法错误:你写的target=f1()、target=f2()带了函数调用括号,会在主进程中直接执行对应函数,而非将函数对象交给子进程调度调用。
由于f1()内部是无限死循环,代码运行到创建f1Process的行时就会卡住,在主进程内无限执行f1的打印逻辑,根本走不到后续创建f2进程、启动子进程的步骤,因此你只会看到f1的输出,看不到f2的内容。这一现象本质不是多进程串行执行,而是你根本没有成功创建、启动任何子进程,全程只有主进程在运行f1的死循环代码。

修复方案

给target传参时只写函数名,不要加调用括号,将函数对象本身传入,让子进程启动后自行调用目标函数。
修复后的可运行代码:

import multiprocessing
import datetime, time


def f1():
    while True:
        print('F1 Cyclic : ', datetime.datetime.now())
        time.sleep(1)
        
        
def f2():
    while True:
        print('F2 Cyclic : ', datetime.datetime.now())
        time.sleep(2)
        

print('Starting main')
       
# 注意:去掉函数名后的调用括号
f1Process = multiprocessing.Process(target=f1)
f2Process = multiprocessing.Process(target=f2)

f1Process.daemon = False
f2Process.daemon = False

f1Process.start()
f2Process.start()   

print('Ending main')
补充说明
  • 你提到移除while循环后多进程“正常运行”是假象:此时f1、f2没有死循环,会在主进程中顺序执行完返回None,最终两个Process对象的target实际是None,子进程启动后不会执行任何业务逻辑,你看到的输出都是主进程顺序调用f1、f2打印的,并非多进程并行效果。
  • 如果需要给目标函数传递参数,不要在函数名后加括号传参,要通过Process的args(位置参数)、kwargs(关键字参数)字段传递,例如给f1传周期值的写法为:multiprocessing.Process(target=f1, args=(1,))。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:48:53