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。功能失敗
該代碼不會返回任何數據。它可以只用於: p.map(並行,範圍(8))? 如果每個並行呼叫是相互獨立的,「結果」是什麼樣的? – Shejo284 2012-07-25 12:21:17
@ 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
偉大的解決方案,謝謝!如果可以的話,最後兩個問題。如果我想運行除並行之外的一組不同功能: results = p.map([Parallel,f2,f3,... f8],range(8)) 這是否行得通? 等待,直到每個過程完成之前調用: results = p.map(並行,範圍(8)) 可以重複嗎? – Shejo284 2012-07-25 12:35:08