我一直在进行多处理。我的代码是这样的。我只想 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()
答案 0 :(得分:1)
您显然在不使用操作系统 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
的同一个实例。