gpt4 book ai didi

python - 使用 python 和多处理压缩输出

转载 作者:行者123 更新时间:2023-11-28 23:04:12 24 4
gpt4 key购买 nike

所以我一直在用 numpy 和多处理写数字的东西有一段时间了。它工作正常,但我在收集结果时遇到了问题。我是通过以下方式完成的,我使用一个队列进行输入,一个队列进行输出。程序从输入队列中读取参数,进行处理,然后将结果放入输出队列。后来在主要过程中,我从队列中读出它并 pickle 它。像这样:

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()

但不知何故,总是会发生以下两种情况之一: pickle 变空,或者进程挂起并保持运行,使用 0% cpu(一开始它们会上升到 100%,这基本上是数字运算)。对我做错了什么有什么想法吗?

好的,所以我用 Pool.map() 重做了它。只是为了让每个人都知道我是如何让它工作的,这里是代码片段:

    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]

像魅力一样工作,更容易实现!

谢谢费迪南德!我不确定如何,但我想我们现在可以结束这个问题了!

最佳答案

您至少需要在 get 调用中放置一个 timeout,并移除 block。在您当前的配置中,如果在调用 get 时没有可用的项目,您将得到 Empty 异常,从而跳出循环。如果您依赖于不同的线程来填充该队列并且它没有及时填充它,它将过早退出循环并产生空结果。同样,put 可能会因为队列已满而挂起,从而挂起您的程序。

所以,使用这样的东西:

params = inp.get(timeout=1)
out.put(timeout=1)

关于python - 使用 python 和多处理压缩输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7890306/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com