我在多进程中卡住了。我的代码是这样的。我想让func_once()
只在开始时工作。然后其他函数应该与多处理一起工作。但是func_once()
函数是平行的,反复的。我该如何处理?
from multiprocessing import Process
import sys
rocket = 0
def func_once():
print("this func works one.")
func_once()
def func1():
global rocket
print ('start func1')
while rocket < sys.maxsize:
rocket += 1
print ('end func1')
def func2():
global rocket
print ('start func2')
while rocket < sys.maxsize:
rocket += 1
print ('end func2')
if __name__=='__main__':
p1 = Process(target=func1)
p1.start()
p2 = Process(target=func2)
p2.start()
您显然运行在不使用操作系统fork
调用而是使用spawn
调用来创建新进程的平台下。简单来说,这意味着当您创建一个新进程时,每个进程都从程序的最顶层开始执行。这就是为什么:
- 启动新进程的代码必须在
if __name__ == '__main__':
块内。如果不是,你就会进入一个递归循环,你刚刚创建的进程会重新执行创建新进程的代码。 - 您正在创建的两个进程都调用
func_once
(如我们所见,命名不好)。
正如@anjandash正确评论的那样,任何在全局范围内的代码,如果你不想被你创建的进程重复执行,应该被移动,即对func_once
的调用(你可以把函数定义留在它所在的地方;它没有真正的危害):
if __name__=='__main__':
func_once() # moved to here
p1 = Process(target=func1)
p1.start()
p2 = Process(target=func2)
p2.start()
p1.join()
p2.join()
而且,每个进程都有自己的内存空间,并看到自己的声明rocket = 0
的副本。也就是说,func1
和func2
将而不是对rocket
的同一个实例进行递增。