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個のジョブを実行しようとするこの変更をテストしました。これはすべて、2つのforループと一連の内部関数呼び出しを組み合わせた単一のPythonファイルに含まれています。スクリプトは失敗し、エラー出力は以下のとおりです。

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) 
####クラスターからのエラーメッセージ

スレッドスレッド3の例外:トレースバック(最後の最後の呼び出し):ファイル "/software/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)ファイル "/ software / apps / python / 2.7.2-smhi1 / lib / python2.7 / multiprocessing / pool.py "、313行目、_handle_tasks put(task)PicklingError:ピクルスできません:属性ルックアップ__builtin.functionが失敗しました

4

1 に答える 1

3

マルチプロセッシングを調べたいと思うかもしれません。コードは次のように実行できます。

import multiprocessing

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

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

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

1つの警告:インタラクティブインタプリタでこれを試さないでください。

于 2012-07-25T12:18:35.427 に答える