所以我已经用numpy和multiprocessing写了一段时间的数值。它工作正常,但我收集结果有困难。我用下面的方法来完成,我用一个队列作为输入,一个队列作为输出。程序从输入队列读取参数,对其进行处理,然后将结果放入输出队列。稍后,在主进程中,我从队列中读取它并对其进行pickle处理。像这样:
def fun(inp,outp):
while True:
try:
params = inp.get(block=False)
results = runprocess(params)
out.put(results,block=False)
except Empty:
break
稍后在主循环中,我将执行以下操作:
^{pr2}$但不知何故,总会有两种情况发生:要么pickle是空的,要么进程挂起并保持运行,使用0%的cpu(一开始它们会上升到100%,基本上是数字运算)。你觉得我做错什么了吗?在
好吧,我重新做了一遍池.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
,并删除{get
时没有可用的项,您将得到Empty
异常,并跳出循环。如果您依赖于另一个线程来填充该队列,但它没有及时填充它,那么它将过早地退出循环并产生一个空结果。同样,由于队列已满,put
可能会挂起,从而挂起程序。在所以,用这样的方法:
因为你有block=False。当收集器试图从队列中获取数据时,它不会立即在队列中找到数据。因此,引发空异常并将其跳出循环
从输入列表中获取数据时,可以指定block=False作为它的预填充列表。但是,输出队列是在运行时生成的。因此,当您试图从中获取数据时,它可能是空的,因为输入过程需要更长的时间来处理。在
如果知道输入队列的长度,那么可以尝试无限期地阻塞输出队列qet。如果没有,我建议你暂停一下。在
相关问题 更多 >
编程相关推荐