我正在尝试在脚本上使用多重处理。但这是行不通的。我究竟做错了什么?我搜索了太多,但是没有找到解决方案。你能帮我吗?
似乎 HistogramMerger 用于多处理。我在运行脚本时看到了一些打印输出,但没有得到通常通过for循环获得的任何结果文件。
我收到此错误消息:
AttributeError: 'module' object has no attribute 'histogramAdd'
ps:此直方图合并脚本将多个文件合并为一个文件。而且,我试图以比正常情况更快的速度运行此脚本。如果您知道更好的解决方案,请告诉我。
没有多重处理(有效)
from histogram_merger import HistogramMerger
var1=697
var2=722
with HistogramMerger("results/resMergedHistograms_"+str(var1)+"_"+str(var1)+".root") as hm:
for i in xrange(var1,var2+1):
print "Run Number : " +str(i)
hm.addHistogramFile("../results/run"+str(i)+"/run"+str(i)+"_histo.root")
具有多处理功能
from histogram_merger import HistogramMerger
from multiprocessing import Pool
var1=697
var2=722
##################################################
arrayOfNumbers = [xx for xx in range(var1, var2+1)]
print(arrayOfNumbers)
pool = Pool(8)
def histogramAdd(run):
print("Run Number : "+str(run))
hm.addHistogramFile("../results/run"+str(run)+"/run"+str(run)+"_histo.root")
if __name__ == '__main__':
with HistogramMerger("results/resMergedHistograms_"+str(var1)+"_"+str(var2)+".root") as hm:
pool.map(histogramAdd, arrayOfNumbers)
pool.join()
答案 0 :(得分:0)
错误消息很奇怪。 hm
不在函数histogramAdd
的范围内。我期望像NameError: name 'hm' is not defined
这样的东西。也许您没有显示某些hm
导入。
无论如何,您都需要将对象传递给函数。您可以为此使用functools.partial
。例如
from functools import partial
# ...
def histogramAdd(run, hm): # <- extra parameter!
print("Run Number : "+str(run))
hm.addHistogramFile("../results/run"+str(run)+"/run"+str(run)+"_histo.root")
if __name__ == '__main__':
with HistogramMerger("results/resMergedHistograms_"+str(var1)+"_"+str(var2)+".root") as hm:
pool.map(partial(histogramAdd, hm), arrayOfNumbers)
pool.join()