我正在使用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
答案 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进程。