使用多处理的问题

时间:2012-07-30 08:58:36

标签: python multiprocessing pool

也许你可以帮我找到设置多处理功能的错误。 我设置了一个worker函数,它获取数据(类型为float)并计算平均值。 如果我使用以下代码(使用join()),则不会启动多处理,每个for循环都会一个接一个地运行。计算正确的值。

相反,当我删除join() - 函数时,启用了并行处理,但是发生了错误,并且大多数计算数据都是相同的。似乎工作进程不使用自己的列表变量。 你能给我一个提示吗?谢谢。斯特凡

for hostgroup in hostgroups:
jobs = []
#multiprocessing.log_to_stderr(logging.DEBUG)
p = multiprocessing.Process(target=worker, args=(hostgroup,hostsfile,mod_inputfile,outputdir,testmode,backup_dir,start_time,end_time,rrdname,unit,yesterday,now_epoch,rrd_interval,rrd_heartbeat,name))
jobs.append(p)
p.start()
p.join()

UPDATE,即使用Pool,但仍然不是并行的:

number_of_processes = len(hostgroups)
if __name__ == '__main__':
pool = multiprocessing.Pool(processes=number_of_processes)
for hostgroup in hostgroups:
    result = pool.apply_async(worker, [hostgroup,hostsfile,mod_inputfile,outputdir,testmode,backup_dir,start_time,end_time,rrdname,unit,yesterday,now_epoch,rrd_interval,rrd_heartbeat,name])
    print result.get(timeout=30)

UPDATE,这似乎是并行的,但只有一些进程正确结束(总是不同):

number_of_processes = len(hostgroups)
if __name__ == '__main__':
pool = multiprocessing.Pool()
results = []
for hostgroup in hostgroups:
    results.append(pool.apply_async(worker,[hostgroup,hostsfile,mod_inputfile,outputdir,testmode,backup_dir,start_time,end_time,rrdname,unit,yesterday,now_epoch,rrd_interval,rrd_heartbeat,name]))
pool.close()
pool.join()

1 个答案:

答案 0 :(得分:2)

p.join()将阻止主线程,直到进程完成其工作。要获得真正的并行性,您需要在调用join()之前启动所有作业。

代码示例

jobs = []
for hostgroup in hostgroups:
    p = multiprocessing.Process(target=worker, args=(hostgroup,hostsfile,mod_inputfile,outputdir,testmode,backup_dir,start_time,end_time,rrdname,unit,yesterday,now_epoch,rrd_interval,rrd_heartbeat,name))
    jobs.append(p)
    p.start()
[p.join() for p in jobs]