2011-08-25 10 views
11

私はPythonでマルチプロセッシングを理解しようとしています。関数の戻り値を変数に代入すると、多重処理が行われますか?そしてIDLEについての問題?

from multiprocessing import Process 

def multiply(a,b): 
    print(a*b) 
    return a*b 

if __name__ == '__main__': 
    p = Process(target= multiply, args= (5,4)) 
    p.start() 
    p.join() 
    print("ok.") 

このコードブロックでは、たとえば、「結果」という変数があった場合です。乗算関数の戻り値を "result"にどのように割り当てることができますか?

IDLEについて少し問題があります。このサンプルをPythonシェルで実行しようとすると、正しく動作しません。私はの.pyファイルをダブルクリックすると、出力はそのようなものです:

20 
ok. 

しかし、私はIDLEでこれを実行しようとした場合:

ok. 

おかげで...

+0

IDLEの部分が別々ですIDLEが行う/しなければならない標準的なリダイレクションによって引き起こされている可能性があります。これは、あなたのコードが生成されたプロセスでは難しいでしょう。 – delnan

答えて

13

[OK]を、私は何とか管理この。私はPythonのドキュメントを見て、私は学んだ:キュークラスを使用すると、我々は関数から戻り値を取得することができます。私のコードの最終版は次のようなものです:

from multiprocessing import Process, Queue 

def multiply(a,b,que): #add a argument to function for assigning a queue 
    que.put(a*b) #we're putting return value into queue 

if __name__ == '__main__': 
    queue1 = Queue() #create a queue object 
    p = Process(target= multiply, args= (5,4,queue1)) #we're setting 3rd argument to queue1 
    p.start() 
    print(queue1.get()) #and we're getting return value: 20 
    p.join() 
    print("ok.") 

また、pipe()関数もあります。パイプ関数も使えると思います。しかし、キューは今私のために働いた。

5

これは役に立ちますか?これは、関数のリスト(とその引数)を取り、それらを並行して実行し、 、その出力を返します:(これは古いです。その多く新しいバージョンhttps://github.com/cpbl/cpblUtilities/blob/master/parallel.pyである)

def runFunctionsInParallel(listOf_FuncAndArgLists): 
    """ 
    Take a list of lists like [function, arg1, arg2, ...]. Run those functions in parallel, wait for them all to finish, and return the list of their return values, in order. 

(This still needs error handling ie to ensure everything returned okay.) 

    """ 
    from multiprocessing import Process, Queue 

    def storeOutputFFF(fff,theArgs,que): #add a argument to function for assigning a queue 
     print 'MULTIPROCESSING: Launching %s in parallel '%fff.func_name 
     que.put(fff(*theArgs)) #we're putting return value into queue 

    queues=[Queue() for fff in listOf_FuncAndArgLists] #create a queue object for each function 
    jobs = [Process(target=storeOutputFFF,args=[funcArgs[0],funcArgs[1:],queues[iii]]) for iii,funcArgs in enumerate(listOf_FuncAndArgLists)] 
    for job in jobs: job.start() # Launch them all 
    for job in jobs: job.join() # Wait for them all to finish 
    # And now, collect all the outputs: 
    return([queue.get() for queue in queues]) 
+0

素晴らしい提案、私はビデオ処理のためにここに使用した:http://stackoverflow.com/questions/38203239/multiprocessing-of-video-frames-in-python。しかし、これはキューに入る前にプロセスに参加することなく私のために働くだけです - ドキュメントにも記載されています:https://docs.python.org/2/library/multiprocessing.html#programming-guidelines – jlarsch

関連する問題