具有特定功能的多处理



我在多进程中卡住了。我的代码是这样的。我想让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调用来创建新进程的平台下。简单来说,这意味着当您创建一个新进程时,每个进程都从程序的最顶层开始执行。这就是为什么:

  1. 启动新进程的代码必须在if __name__ == '__main__':块内。如果不是,你就会进入一个递归循环,你刚刚创建的进程会重新执行创建新进程的代码。
  2. 您正在创建的两个进程都调用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的副本。也就是说,func1func2而不是rocket的同一个实例进行递增。

相关内容

  • 没有找到相关文章

最新更新