2012-07-25 142 views
0

我很想知道是否可以運行一個調用函數作爲並行子進程的python腳本。我不確定我是否正確使用這些術語,所以這裏是一個由bash腳本構成的概念腳本,可以完成我正在談論的內容。並行進程

import Zfunctions as Z 
reload(Z) 

def Parallel(): 
    statements 
    calls to other functions in a general function file Z 

#-------------- 
if '__name__' == '__main__': 
    # Running this script in a linux cluster with 8 processing node available 
    Parallel() & #1st process sent to 1st processing node 
    Parallell() & #2nd process sent to 2nd node 
    . 
    . 
    . 
    Parallell() & #8th process sent to 8th node 
    wait 

現在我所知道的符號(&)和「等待」都錯了,但在bash中是發送到進程的背景和等待這些過程完成的方式。我現在的問題是,希望更清楚一點:這可以用python完成,如果可以,怎麼做?

任何幫助表示讚賞。

/M

我已經得到了一些很好的幫助。我測試了這個修改我的問題上面,它試圖運行60個作業,將處理大量的數據並將結果寫入磁盤。所有這些都在一個單獨的python文件中,它結合了兩個for循環和一系列內部函數調用。該腳本失敗和錯誤輸出如下發現:從集羣

異常螺紋加工-3

import multiprocessing 

def Parallel(m,w,PROCESSES):                
plist = {}                   
plist['timespan'] = '2007-2008'              
print 'Creating pool with %d processes\n' % PROCESSES         
pool = multiprocessing.Pool(PROCESSES)            
print 'pool = %s' % pool                

TASKS = [(LRCE,(plist,m,w)),(SRCE,(plist,m,w)),(ALBEDO,(plist,m,w)),     
     (SW,(plist,m,w)),(RR,(plist,m,w)),(OLR,(plist,m,w)),(TRMM,(plist,w)),  
     (IWP,(plist,m,w)),(RH,(plist,'uth',m,w)),(RH,(plist,200,m,w)),    
     (RH,(plist,400,m,w)),(IWC,(plist,200,m,w)),(IWC,(plist,400,m,w)),   
     (CC,(plist,200,m,w)),(CC,(plist,400,m,w))]                           

results = [pool.apply_async(calculate,t) for t in TASKS]        
print 'Ordered results using pool.apply_async():'          
for r in results:                  
    print '\t', r.get()                

#-----------------------------------------------------------------------------------  
if __name__ == '__main__':                
PROCESSES = 8                   
for w in np.arange(2):                
    for m in np.arange(2):               
     Parallel(m,w,PROCESSES) 
####錯誤消息: 回溯(最近通話最後一個): 文件「/軟件/ apps/python/2.7.2-smhi1/lib/python2.7/threading.py「,第552行,在 bootstrap_inner self.run() 文件」/software/apps/python/2.7.2-smhi1/lib /python2.7/threading.py「,行505,運行 self .__ target(* self .__ args,** self .__ kwargs) File」/software/apps/python/2.7.2-smhi1/lib/python2 .7/multiprocessing/pool.py「,行313,在_handle_tas KS 放(任務) PicklingError:不能鹹菜:屬性查找__builtin。功能失敗

回答

3

你可能想看看multiprocessing - 你的代碼可以實現如下:

import multiprocessing 

def Parallel(junk):  
    #...snip... 

if __name__ == "__main__": 
    p = multiprocessing.Pool(8) 

    results = p.map(Parallel, range(8)) 

一警告:不要在交互式解釋器中嘗試此操作。

+0

該代碼不會返回任何數據。它可以只用於: p.map(並行,範圍(8))? 如果每個並行呼叫是相互獨立的,「結果」是什麼樣的? – Shejo284 2012-07-25 12:21:17

+1

@ Shejo284 - python函數總是返回* something *。即使沒有明確的return語句,他們也會返回None。所以,在這種情況下,你會得到8個「None」值的列表。你可以選擇不存儲它:'p.map(Parallel,range(8))'而不是'results = p.map(Parallel,range(8))''。 – mgilson 2012-07-25 12:24:40

+0

偉大的解決方案,謝謝!如果可以的話,最後兩個問題。如果我想運行除並行之外的一組不同功能: results = p.map([Parallel,f2,f3,... f8],range(8)) 這是否行得通? 等待,直到每個過程完成之前調用: results = p.map(並行,範圍(8)) 可以重複嗎? – Shejo284 2012-07-25 12:35:08