Python多进程示例未提速问题:为何多进程与串行耗时一致?
问题诊断与解决
你遇到的这个问题其实是Python多进程创建时的一个常见小错误——你在给Process的target参数赋值时,直接调用了函数(带括号()),而不是传递函数本身的引用。
错误原因拆解
看你这段代码:
p1 = multiprocessing.Process(target = multi1.main(), args=())
这里的multi1.main()会在创建进程对象的瞬间就被同步执行,而不是让子进程去执行。也就是说,在你调用p1.start()之前,三个main()函数已经按顺序跑完了,后面的start()和join()其实是在操作三个没有实际任务的空进程。
所以你的“多进程测试段”本质上和后面的同步执行段做了完全一样的事情:都是同步运行了三次main(),耗时自然完全相等。
修正后的代码
只需要去掉target里函数名后的括号,把函数本身传给target即可:
import multiprocessing import multi1 import multi2 import multi3 import time t0 = time.time() if __name__ == '__main__': # 去掉main后面的(),传递函数引用而非执行结果 p1 = multiprocessing.Process(target=multi1.main, args=()) p2 = multiprocessing.Process(target=multi2.main, args=()) p3 = multiprocessing.Process(target=multi3.main, args=()) p1.start() p2.start() p3.start() p1.join() p2.join() p3.join() t1 = time.time() multi1.main() multi2.main() multi3.main() t2 = time.time() # 建议统一使用Python3的print函数写法 print(t1 - t0) print(t2 - t1)
补充说明
- 如果你的
main()函数需要传参数,把参数放在args元组里即可,比如args=(10, "demo")。 - 另外注意你的代码里
print t1-t0是Python2的写法,现在主流环境都是Python3,建议改成带括号的print(t1-t0)。
内容的提问来源于stack exchange,提问作者Victor Pira
相关产品推荐
相关产品推荐

