multiprocessing.pool在进行并行计算时卡住了

时间:2016-08-31 16:05:13

标签: python numpy multiprocessing

(这是在Ubuntu 14.02上使用python 2.7.6)

解决问题:

当j = 2时,我的heavy_calculation函数出错了,因此代码无法给出答案。这不是多处理的问题。

但是,虽然代码现在可以正常工作,但是当我使用multiprocessing.dummy而不是多处理时它报告错误。错误与我在Addition part中写的相同。我认为这不是一个致命的错误,否则代码根本无法工作。我可以忽略它吗?

增加:

我使用multiprocessing.dummy进行调试。

当PROCESSES> 1(例如PROCESSES = 2),代码在pool.map开始后立即退出,并显示错误:

Traceback (most recent call last):
  File "binfit1.py", line 81, in <module>
    pool.map(multifit_star,parm)
  File "/usr/lib/python2.7/multiprocessing/pool.py", line 251, in map
    return self.map_async(func, iterable, chunksize).get()
  File "/usr/lib/python2.7/multiprocessing/pool.py", line 558, in get
    raise self._value
IndexError: list index out of range

问题:

我想同时做一些繁重的计算,我使用多处理包。但是,multiprocessing.Pool会在计算时卡住。我的代码的简化版本是:

import numpy as np
import multiprocessing as mp
def f(i,j):
    result = heavy_calculation(i,j)  
    result_star = np.array([result])
    # save the result in a certain file
    lock.acquire()
    try:
        temp = np.load('result.npy')
        temp = np.append(temp,result_star,axis=0)
    except:
        temp = result_star
    print temp
    np.save('result.npy',temp)
    lock.release()
def f_star(x):
    return f(*x)
if __name__=='__main__':
    k = 3
    PROCESSES = 4  #I have 8 cores in my computer
    lock = mp.Lock()
    parm = []
    for m in range(0,k):
        for n in range(0,k):
            parm.append([m,n])
    pool = mp.Pool(processes=PROCESSES)
    pool.map(f_star,parm)            
    pool.close()
    pool.join()
    final_result = np.load('result.npy')
    print final_result

当我在终端上运行此代码时,它适用于多个进程,但随后卡在pool.map(f_star,parm)中的某个位置。例如,如果我设置k = 3,这意味着由f(i,j)打印的最后一个temp应该具有3 * 3 = 9的长度,代码将在temp的长度仅为6时停止它给出的6个结果是正确的,但它从未给出其他3个结果。

由于执行永远不会完成,我必须重新启动终端。有什么问题?

提前致谢,

此致

舒尔

0 个答案:

没有答案