python - 即使在 .join() 之后,多处理也会创建僵尸进程
问题描述
我有一大段代码,我正在以下列方式并行化:-
def stats_wrapper(a,b,c,d):
q = mp.Queue()
# b here is a dictionary
processes = [mp.Process(target = stats,args = (a,{b1:b[b1]},c,d,q) ) for b1 in b]
for p in processes:
p.start()
results = []
for p in processes:
results.append(q.get())
return(results)
执行此块后,我看到很多僵尸进程。我正在尝试.join()
在该行之前以下列方式使用该方法return(result)
:-
for p in processes:
p.join()
但这无助于摆脱僵尸进程。有人可以帮我确定我的代码哪里出了问题吗?
编辑: - 我在代码的其他地方使用了另一种并行化方法,这再次给了我许多僵尸进程,除了我不知道如何重构代码以添加连接。
q = mp.Queue()
jobs = (func1,func2,func3)
args = ((arg1,arg2,arg3),(arg2,arg3),(arg1,arg4))
for job,arg in zip(jobs,args):
mp.Process(target = job,args = arg,name = str(job.__name__)).start()
result = []
for _ in range(len(job)):
result.append(q.get())
解决方案
如果你愿意尝试更高级别multiprocessing.Pool()
,
def stats_wrapper(a, b, c, d):
with multiprocessing.Pool() as p:
args = [(a, {b1: b[b1]}, c, d) for b1 in b]
return list(p.starmap(stats, args))
应该是等价的(除了q
不被传递给stats
; 该函数可以简单地返回结果)。
如果您不需要结果有序,请使用p.imap_unordered()
,它可以更有效地使用进程池。
推荐阅读
- c# - Unity - 确定与不同“标签”的项目冲突
- react-native - 我应该在 react-native/redux fetch 中使用什么而不是 Body.text() 来进行非 UTF-8 编码?
- ruby-on-rails - 从 CSV 行创建的散列不像普通散列那样表现
- c# - 使用 webforms C# 和 ajax 控制工具包的 Internet Explorer 11 上的冲突
- redirect - php 位置标头重定向即使在输出开始后仍然有效
- java - Java 访问者模式同时使用原始类型和类
- xml - 如果元素内容相同,XSLT 合并两个 XML 文件
- javascript - 如何为 js 捆绑应用提供配置?
- exception - 默认情况下,出站处理程序是否应该传递 ChannelPromise?
- python - 用科学计数法写 json float