2016-09-05 3 views
3

multiprocessingProcessの場合、を使用できます。args paramを設定します。Python:マルチプロセッシングプールでValueとArrayを使用する方法

multiprocessingPoolを使用するにはどうすれば使用できますかValue, Array.ドキュメントの操作方法は何もありません。

from multiprocessing import Process, Value, Array 

def f(n, a): 
    n.value = 3.1415927 
    for i in range(len(a)): 
     a[i] = -a[i] 

if __name__ == '__main__': 
    num = Value('d', 0.0) 
    arr = Array('i', range(10)) 

    p = Process(target=f, args=(num, arr)) 
    p.start() 
    p.join() 

    print(num.value) 
    print(arr[:]) 

Value, Arrayを以下のコードスニペット内で使用しようとしています。私は、このための「理由」が、multiprocessingmpを)知らなかった

import multiprocessing 


def do_calc(data): 
    # access num or 
    # work to update arr 
    newdata =data * 2 
    return newdata 

def start_process(): 
    print 'Starting', multiprocessing.current_process().name 

if __name__ == '__main__': 
    num    = Value('d', 0.0) 
    arr    = Array('i', range(10)) 
    inputs   = list(range(10)) 
    print 'Input :', inputs 

    pool_size  = multiprocessing.cpu_count() * 2 
    pool   = multiprocessing.Pool(processes=pool_size,initializer=start_process,) 
    pool_outputs = pool.map(do_calc, inputs) 
    pool.close() # no more tasks 
    pool.join() # wrap up current tasks 

    print 'Pool :', pool_outputs 

答えて

6

は最もPoolメソッドに渡された機能のために異なるPicklerさん/ Unpicklerクラスのメカニズムを使用しています。それはのようなものによって作成されたオブジェクトの結果だmp.Valuemp.Arraymp.Lock、...彼らはのオプションinitializer機能にmp.Processに引数として渡すことができるが、そのようなメソッドの引数として渡すことはできませんmp.Pool()

import multiprocessing as mp 

def init(aa, vv): 
    global a, v 
    a = aa 
    v = vv 

def worker(i): 
    a[i] = v.value * i 

if __name__ == "__main__": 
    N = 10 
    a = mp.Array('i', [0]*N) 
    v = mp.Value('i', 3) 
    p = mp.Pool(initializer=init, initargs=(a, v)) 
    p.map(worker, range(N)) 
    print(a[:]) 

をしているが、これはプラットフォーム間で仕事を得るために私の知っている唯一の方法だ

[0, 3, 6, 9, 12, 15, 18, 21, 24, 27] 

を出力しますので、後者の、これは動作します。 (mpfork()を経由して新しいプロセスを作成します)のLinux-yのプラットフォームで

、あなたの代わりにあなたのmp.Arraymp.Value(など)を作成することができ、あなたがmp.Pool()を行う前にモジュールグローバルとしていつでもオブジェクト。 fork()によって作成されたプロセスは、mp.Pool()が実行されるときに、モジュールのグローバルアドレス空間にあるものを継承します。

しかし、これはfork()をサポートしていないプラットフォーム(「Windows」と読みます)ではまったく動作しません。

+0

元の質問に回答した場合は、その回答を受け入れて新しい質問を表示する必要があります。それ以外の投稿は、無限の無関係なコメントの理解できない混乱になります。 –

関連する問題