2012-07-30 36 views
1

也許你可以幫我找到我在設置多重處理功能時的錯誤。 我設置了一個工作函數,它提取數據(類型爲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,這正與游泳池,但仍然不平行:

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

回答

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] 
+0

奇怪的是,每對循環中的所有結果都是一樣的。 – StefanS 2012-07-30 10:22:18