Python多处理不会退出

时间:2015-08-04 22:30:03

标签: python parallel-processing python-2.x

我有一个成功运行的代码,但运行时间太长。所以我决定尝试并行化它。

以下是代码的简化版本:

import multiprocessing as mp
import os
import time


output = mp.Queue()

def calcSum(Nstart,Nstop,output):
    pid = os.getpid()

    for s in range(Nstart, Nstop):
        file_name = 'model' + str(s) + '.pdb'

        file = 'modelMap' + str(pid) + '.dat'

        #does something with the contents of the pdb file
        #creates another file by using some other library:
        someVar.someFunc(file_name=file)

        #uses a function to read the file
        density += readFile(file)

        os.remove(file)

        print pid,s

    output.put(density)

if __name__ == '__main__':
    snapshots = int(sys.argv[1])
    cpuNum = int(sys.argv[2])

    rangeSet = np.zeros((cpuNum)) + snapshots//cpuNum
    for i in range(snapshots%cpuNum):
        rangeSet[i] +=1

    processes = []
    for c in range(cpuNum):
        na,nb = (np.sum(rangeSet[:c])+1, np.sum(rangeSet[:c+1]))
        processes.append(mp.Process(target=calcSum,args=(int(na),int(nb),output)))

    for p in processes:
        p.start()

    print 'now i''m here' 

    results = [output.get() for p in processes]

    print 'now i''m there' 

    for p in processes:
        p.join()

    print 'think i''l stay around'
    t1 =time.time()
    print len(results)
    print (t1-t0)

我使用命令python run.py 10 4运行此代码。

此代码在pid的外部循环中成功打印scalcSum。我还可以看到终端中有两个CPU处于100%的状态。最后发生的是pid 5pid 10,然后CPU使用率降至零,没有任何反应。以下print语句都不起作用,并且脚本看起来仍然在终端中运行。我猜测过程没有退出。是这样的吗?我该如何解决?

这里有完整的输出:

$ python run.py 10 4
now im here
9600
9601
9602
9603
9602 7
9603 9
9601 4
9600 1
now im there
9602 8
9600 2
9601 5
9603 10
9600 3
9601 6

此时我必须停止使用Ctrl+C终止。

其他几点说明:

  • 如果我评论os.remove(file),我可以在目录
  • 中看到创建的文件
  • 遗憾的是,我无法绕过创建文件的部分,然后在calcSum
  • 内阅读

编辑起初它可以切换output.get()p.join(),但是在代码中进行了一些其他编辑后,它就不再起作用了。我已经更新了上面的代码。

0 个答案:

没有答案