Python多处理导致许多僵尸进程
我一直在使用一组工作人员实现python的多处理库。我实现了以下代码Python多处理导致许多僵尸进程,python,multiprocessing,Python,Multiprocessing,我一直在使用一组工作人员实现python的多处理库。我实现了以下代码 import main1 t1 = time.time() p = Pool(cores) result = p.map(main1, client_list[client]) if result == []: return [] p.close() p.join() print "Time taken in performing request:: ", time.time()-t1 return shorted(
import main1
t1 = time.time()
p = Pool(cores)
result = p.map(main1, client_list[client])
if result == []:
return []
p.close()
p.join()
print "Time taken in performing request:: ", time.time()-t1
return shorted(result)
然而,在运行了一段时间后,我得到了很多运行我的应用程序的后台进程。这是为我的应用程序执行ps aux后的快照
现在,我已经阅读了很多关于stackoverflow的类似问题,比如哪些调用需要使用我已经实现的.join(),我从这里学习了如何终止所有这些进程。但我想知道我的代码可能会出什么问题。
我无法在main1函数中共享我的所有代码,但我已将整个代码块放在try-catch块中,以避免主代码中的错误可能导致僵尸进程的情况
def main1((param1, param2, param3)):
try:
resout.append(some_data) //resout in case of no error
except:
print traceback.format_exc()
resout = [] //sending empty resout in case of error
return resout
我对并行编程的概念还很陌生,调试问题变得很棘手。任何帮助都将不胜感激。通常最常见的问题是创建了池,但池没有关闭 我所知道的保证池关闭的最佳方法是使用try/finally子句:
try:
pool = Pool(ncores)
pool.map(yourfunction, arguments)
finally:
pool.close()
pool.join()
如果您不想在多处理
中挣扎,我编写了一个名为parmap
的简单包,它包装了多处理,使我(可能还有您)的生活更轻松
pip安装parmap
import parmap
parmap.map(yourfunction, arguments)
从parmap用法部分:
- 简单的并行示例:
import parmap y1 = [myfunction(x, argument1, argument2) for x in mylist] y2 = parmap.map(myfunction, mylist, argument1, argument2) y1 == y2
- 迭代元组列表:
# You want to do: z = [myfunction(x, y, argument1, argument2) for (x,y) in mylist] z = parmap.starmap(myfunction, mylist, argument1, argument2) # You want to do: listx = [1, 2, 3, 4, 5, 6] listy = [2, 3, 4, 5, 6, 7] param = 3.14 param2 = 42 listz = [] for (x, y) in zip(listx, listy): listz.append(myfunction(x, y, param1, param2)) # In parallel: listz = parmap.starmap(myfunction, zip(listx, listy), param1, param2)
pool()
一次)。当您最终完成工作进程时,调用close
和join
非常重要-它们是进程终止的信号;它们不仅仅是为了让僵尸流产。在上面的第一个代码块中,如果results
为空,则您永远不会终止worker,只需将返回给调用方的任何代码即可。对于不想处理与多处理相关的混乱的开发人员来说,这实际上非常方便。