Python多重处理-对象没有属性

时间:2018-11-23 16:26:59

标签: python multiprocessing python-multiprocessing

我正在尝试在脚本上使用多重处理。但这是行不通的。我究竟做错了什么?我搜索了太多,但是没有找到解决方案。你能帮我吗?

似乎 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()

1 个答案:

答案 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()