多处理过程是否必须在函数结束时终止?

时间:2014-06-07 17:50:11

标签: python multiprocessing

在函数的最后包含proc.terminate()proc.join()以确保multiprocessing进程在完成后关闭/关闭/终止是不错的做法有它的工作(已经达到它运行的功能的结束)?

从测试开始,我发现似乎每个multiprocessing进程都自行终止,而不需要用proc.terminate()隐式终止它。但我仍然希望确保在函数结束时终止该过程是不必要的。

import time
import multiprocessing as mp

def myFunct(arg):
    proc=mp.current_process()
    print 'starting:', proc.name, proc.pid,'...\n'
    for i in range(110):
        for n in range(500000):
            pass
    print '\t ...', proc.name, proc.pid, 'completed\n'

    print 'Is proc alive:', proc.is_alive()
    proc.terminate()
    print 'TERMINATED:', proc.is_alive()
    proc.join()
    print 'JOINED:', proc.is_alive()


pool = mp.Pool(processes=2)
pool.map_async( myFunct, [1,2,3])
pool.close()
pool.join()

1 个答案:

答案 0 :(得分:3)

不,没有必要。事实上,它在docs

中明确表示不鼓励
  

请注意start(),join(),is_alive(),terminate()和exitcode   方法只应由创建该进程的进程调用   对象

您不应该在工作职能部门内调用terminatejoin。当您使用multiprocessing.pool时,池中的进程将保持打开状态

  1. 只要您没有调用pool.close()
  2. 只要流程正在开展工作。
  3. 在您的情况下,您在拨打pool.close电话后立即致电map_async,因此一旦他们完成处理,池中的流程就会关闭。 pool.join调用将确保程序等待,直到关闭为止。