【发布时间】:2011-10-25 13:51:02
【问题描述】:
所以一段时间以来,我一直在用 numpy 和多处理编写数字内容。它工作正常,但我无法收集结果。我已经通过以下方式完成了它,我将一个队列用于输入,一个用于输出。程序从输入队列中读取参数,对其进行处理,然后将结果放入输出队列。稍后在主进程中,我从队列中读出它并腌制它。像这样的:
def fun(inp,outp):
while True:
try:
params = inp.get(block=False)
results = runprocess(params)
out.put(results,block=False)
except Empty:
break
稍后在主循环中我执行以下操作:
for p in processes:
p.start()
for p in processes:
p.join()
while True:
try:
out = outp.get(block=False)
a[i] = [out]
except Empty:
break
fi = open(filename,"w")
cPickle.dump(fi,a)
fi.close()
但不知何故,总是会发生以下两种情况之一:要么泡菜空了,要么进程挂起并保持运行,使用 0% 的 cpu(一开始它们上升到 100%,这基本上是数字运算)。对我做错了什么有什么想法吗?
好的,所以我用 Pool.map() 重做了它。让每个人都知道我是如何让它在这里工作的就是 sn-p:
ncpus = mp.cpu_count()
out = dict()
params = [(a,p) for p in np.arange(0.0,2.0,0.1) for a in np.arange(0.001,2.0,0.1)]
pool = mp.Pool(processes=ncpus)
results = pool.map(runm,params)
for i in results:
sigs = np.zeros((order,order))
sigsmf = np.zeros((order,order))
sigseq = np.zeros((order,order))
xs = np.array([])
freqs = np.array([])
[(a,p),sigs[:,:],sigsmf[:,:],sigseq[:,:],xs,freqs] = i
out[(a,p)] = [sigs[:,:],sigsmf[:,:],sigseq[:,:],xs,freqs]
print a, p, sigs[0,0]
像魅力一样工作,更容易实现!
感谢费迪南德!我不知道怎么做,但我想我们现在可以结束这个问题了!
【问题讨论】:
-
“i”是否在其他地方增加?
-
您可能需要考虑使用更简单的
Pool.map()界面来为您处理所有无聊的细节:results = pool.map(runprocess, input_parameters)。见docs.python.org/library/… -
我实际上并没有使用 i,我使用的是字典,所以这不是问题 ;)。我将查看池界面!谢谢!
-
这意味着我必须将 input_parameters 作为一个列表,对吧?
标签: python numpy multiprocessing multicore pickle