2016-12-20 14 views
0

これは私の実際のアプリケーションの人為的な例のように私に負担してください。私が数字のリストを持っていて、複数のプロセスを使ってリスト内の各数字に一つの数字を追加したかったとします。私はこのようなことをすることができます:Pythonマルチプロセッシングのさまざまなプロセスの異なる入力

import multiprocessing 
my_list = list(range(100)) 
my_number = 5 
data_line = [{'list_num': i, 'my_num': my_number} for i in my_list] 

def worker(data): 
    return data['list_num'] + data['my_num'] 

pool = multiprocessing.Pool(processes=2) 
pool_output = pool.map(worker, data_line) 
pool.close() 
pool.join() 

しかし、私の問題にはしわがあります。 2つの数字を交互に追加したいとします(1つだけ追加するのではなく)。だから半分くらいの時間で、私はmy_number1を追加し、残りの半分はmy_number2を追加したいと思います。どの番号がリストのどの項目に追加されるかは関係ありません。しかし、1つの要件は、異なるプロセス間で同時に同じ番号を同時に追加したくないということです。これは本質的に(私は)思うところですが、プロセス1の最初の番号とプロセス2の2番目の番号を排他的に使用して、同じ番号を同時に追加することはありません。したがって、次のようなものがあります。

my_num1 = 5 
my_num2 = 100 
data_line = [{'list_num': i, 'my_num1': my_num1, 'my_num2': my_num2} for i in my_list] 
def worker(data): 
    # if in Process 1: 
    return data['list_num'] + data['my_num1'] 
    # if in Process 2: 
    return data['list_num'] + data['my_num2'] 
    # and so forth 

プロセスごとに特定の入力を指定する簡単な方法はありますか?この問題を考えるもう一つの方法はありますか?

答えて

1

multiprocessing.Poolは、実際に与えられた関数が実行される前に実行される初期化関数を実行することを可能にします。

グローバル変数を使用すると、実行中のプロセスを関数が理解できるようになります。

おそらく、プロセスが取得する初期番号を制御する必要があります。 Queueを使用して、どの番号にピックアップするかをプロセスに通知できます。

このソリューションは最適ではありませんが、機能します。

import multiprocessing 


process_number = None 


def initializer(queue): 
    global process_number 

    process_number = queue.get() # atomic get the process index 


def function(value): 
    print "I'm process %s" % process_number 

    return value[process_number] 


def main(): 
    queue = multiprocessing.Queue() 

    for index in range(multiprocessing.cpu_count()): 
     queue.put(index) 

    pool = multiprocessing.Pool(initializer=initializer, initargs=[queue]) 

    tasks = [{0: 'Process-0', 1: 'Process-1', 2: 'Process-2'}, ...] 

    print(pool.map(function, tasks)) 

私のPCは、プロセス0とプロセス1のみが処理されているように、デュアルコアです。

I'm process 0 
I'm process 0 
I'm process 1 
I'm process 0 
I'm process 1 
... 
['Process-0', 'Process-0', 'Process-1', 'Process-0', ... ] 
関連する問題