考虑以下两个简短的程序。
normal_test.py:
import time
if __name__ == '__main__':
t_end = time.time() + 1
loop_iterations = 0
while time.time() < t_end:
loop_iterations += 1
print(loop_iterations)
输出(在我的机器上):
4900677
mp_test.py:
from multiprocessing import Process
from multiprocessing import Manager
import time
def loop1(ns):
t_end = time.time() + 1
while time.time() < t_end:
ns.loop_iterations1 += 1
def loop2(ns):
t_end = time.time() + 1
while time.time() < t_end:
ns.loop_iterations2 += 1
if __name__ == '__main__':
manager = Manager()
ns = manager.Namespace()
ns.loop_iterations1 = 0
ns.loop_iterations2 = 0
p1 = Process(target=loop1, args=(ns,))
p2 = Process(target=loop2, args=(ns,))
p1.start()
p2.start()
p1.join()
p2.join()
print(ns.loop_iterations1)
print(ns.loop_iterations2)
输出(在我的机器上):
5533
5527
我希望在 Raspberry Pi 上使用 Python 多处理来并行读取多个 ADC 的值。因此,速度很重要。我运行这两个程序的笔记本电脑有四个核心,所以我无法理解为什么第二个程序中创建的进程只能运行比第一个程序中的单个进程少近 900 倍的迭代次数。我是否错误地使用了 Python 多处理库?如何使流程更快?
最佳答案
Am I using the Python multiprocessing library incorrectly?
错误?不,效率低下?是的。
请记住,多处理会创建协作但在其他方面独立的 Python 实例。把他们想象成工厂里的 worker ,或者从事一项大工作的 friend 。
如果只有一个人在做一个项目,那么这个人可以在工厂车间自由走动,拿起工具,使用它,放下它,移动到其他地方,拿起工具下一个工具,等等。添加第二个人——或者更糟糕的是,更多的人,甚至数百人——这个人现在必须协调:如果共享某个区域,或者共享某个工具,鲍勃不能只是去拿东西,他必须问爱丽丝首先,如果她已经完成了。
Manager
对象是 Python 多处理用于共享的通用包装器。将变量放入管理器命名空间
中意味着这些变量是共享的,因此在使用它们之前会自动与其他人进行检查。 (更准确地说,它们保存在一个位置(一个进程),并通过代理从其他进程访问或更改。)
在这里,您已经完成了隐喻,相当于将“鲍勃:尽可能快地数数”替换为“鲍勃:不断打断爱丽丝,询问她是否在数数,然后数数;爱丽丝:数数,但不断被鲍勃打断。 ”到目前为止,鲍勃和爱丽丝现在大部分时间都花在互相交谈上,而不是数数。
... when doing concurrent programming it is usually best to avoid using shared state as far as possible. This is particularly true when using multiple processes.
(它以短语“如上所述”开头,但上面没有提到!)。
有很多标准技巧,例如批处理以在共享事件之间完成大量工作,或使用共享内存加快共享速度,但使用共享内存时,您需要锁定项目。
关于Python 多重处理 - 如何提高效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55211814/