为何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
相关产品推荐
相关产品推荐

