如何确保终止多处理池?

时间:2019-07-31 08:29:45

标签: python python-multiprocessing

我正在使用Jupyter笔记本启动multiprocessing.Pool之外的所有废话。不幸的是,有时我的工人有错误,我需要关闭游泳池,然后重新开始。

因此,我有一个单元格,其行为pool.close()。然后,我重新生成一个新池:pool = Pool(n, maxtasksperchild=1),然后按照自己的喜好进行操作。

但是,.close()进入池并没有达到我的预期,现在我的机器上出现了一大堆僵尸。更糟糕的是,我重写了pool变量,因此除了手动发出kill命令外,我无法关闭它们。更糟糕的是,当我为其中一个僵尸发出kill命令时,会弹出一个新的僵尸命令,使我怀疑pool.close()实际上并没有关闭池,池仍然在那里,隐藏在某个地方,甚至在死亡中继续执行它的map_async命令,这将需要2个永远的时间来终止。

换句话说,pool.close()并没有关闭我的游泳池。

我要坐在这里和kill东西一个小时。同时,有谁知道如何:

pool.kill_all_of_the_processes_really_farill_this_time_and_prevent_them_from_ever_popping_back_up_under_any_circumstances_ever()


这是一个可行的示例:

单元格1

import multiprocessing as mp
def work(i):
    import time
    while True:
        time.sleep(0.01)

Cell2

try: 
    pool.close()
except: 
    pass
pool = mp.Pool(8, maxtasksperchild=1)
pool.map_async(work, range(10000000))

重新运行Cell2和ps aux | grep python | wc -l,以查看打开的进程数增加了8

1 个答案:

答案 0 :(得分:4)

documentation中所述:

  

close()       阻止将更多任务提交给池。所有任务完成后,工作进程将退出。

  

terminate()       没有完成出色的工作就立即停止工作进程。当池对象被垃圾回收时   Terminate()将立即被调用。

因此,如果您想终止所有进程而不是等待它们,则应该使用def digits_after_decimal_point(n) splitted = n.to_s.split(".") if splitted.count > 1 return 0 if splitted[1].to_f == 0 return splitted[1].length else return 0 end end # Examples digits_after_decimal_point("1") #=> 0 digits_after_decimal_point("1.0") #=> 0 digits_after_decimal_point("1.01") #=> 2 digits_after_decimal_point("1.00000") #=> 0 digits_after_decimal_point("1.000001") #=> 6 digits_after_decimal_point(nil) #=> 0

关于您的评论: 您可以尝试使用以下命令杀死进程(也请参见here):

terminate()

对我来说,python解释器的路径是唯一的,因为我是在virtualenv中启动它的。您可以使用它仅过滤jupyter python进程。