我有一个成功运行的代码,但运行时间太长。所以我决定尝试并行化它。
以下是代码的简化版本:
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
的外部循环中成功打印s
和calcSum
。我还可以看到终端中有两个CPU处于100%的状态。最后发生的是pid 5
和pid 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()
,但是在代码中进行了一些其他编辑后,它就不再起作用了。我已经更新了上面的代码。