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

为何multiprocessing.Process无法实现并行运行?

问题:multiprocessing.Process 无法实现并行执行

我正在研究Python的multiprocessing模块,试图理解其工作原理及并行代码运行方式,为此编写了如下简单脚本:

import multiprocessing
import time

def write_something(text="Hi mum!", duration=60, interval=1):
    time_end = time.time() + duration
    while time.time() < time_end:
        time.sleep(interval)
        print(text)

def multiprocessing_process():
    process1 = multiprocessing.Process(target=write_something(text="Hi mum!", duration=20, interval=10))
    process2 = multiprocessing.Process(target=write_something(text="Hi dad!", duration=20, interval=5))
    process1.start()
    process2.start()
    process1.join()
    process2.join()

def main():
    multiprocessing_process()
    #multiprocessing_pool()

if __name__ == '__main__':
    main()

根据所学内容,我预期代码会并行执行,但控制台输出为:

Hi mum!
Hi mum!
Hi dad!
Hi dad!
Hi dad!
Hi dad!

而我预期的输出类似:

Hi dad!
Hi dad!
Hi mum!
Hi dad!
Hi mum!
Hi dad!

使用multiprocessing.Pool和async_apply可得到预期结果,但我不理解为何multiprocessing.Process无法实现并行,它理应创建两个独立运行的进程,请问我忽略了什么?


问题原因与修复方案

你犯了一个常见的错误:创建multiprocessing.Process对象时,直接调用了目标函数,而不是传递函数对象和对应的参数。

在你的代码中:

process1 = multiprocessing.Process(target=write_something(text="Hi mum!", duration=20, interval=10))

这里write_something(...)会被立即在主进程中执行,而不是作为目标函数传递给子进程。这导致主进程先完整运行完write_something(text="Hi mum!"),才会继续创建第二个进程并运行write_something(text="Hi dad!"),完全是串行执行,自然没有并行效果。

正确的写法是,将函数对象传给target,然后用args(位置参数)或kwargs(命名参数)传递函数所需的参数:

修复后的代码

import multiprocessing
import time

def write_something(text="Hi mum!", duration=60, interval=1):
    time_end = time.time() + duration
    while time.time() < time_end:
        time.sleep(interval)
        print(text)

def multiprocessing_process():
    # 使用 kwargs 传递命名参数
    process1 = multiprocessing.Process(target=write_something, kwargs={"text": "Hi mum!", "duration":20, "interval":10})
    process2 = multiprocessing.Process(target=write_something, kwargs={"text": "Hi dad!", "duration":20, "interval":5})
    process1.start()
    process2.start()
    process1.join()
    process2.join()

def main():
    multiprocessing_process()
    #multiprocessing_pool()

if __name__ == '__main__':
    main()

也可以用args传递位置参数(注意参数顺序要和函数定义一致):

process1 = multiprocessing.Process(target=write_something, args=("Hi mum!", 20, 10))

修改后,两个进程会被同时启动,各自独立执行write_something函数,就能得到你预期的交替输出效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 18:35:24