具有特定功能的多处理

时间:2021-02-11 16:31:11

标签: python function multiprocessing

我一直在进行多处理。我的代码是这样的。我只想 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()

1 个答案:

答案 0 :(得分:1)

您显然在不使用操作系统 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 的同一个实例。

相关问题