2017-05-03 10 views
0

dataList(たとえば[(1, globalDict), (2, globalDict), (3, globalDict)])に変数を重複して渡すことを避け、代わりにそれらをグローバルに使用したいと考えています。ただし、次のコードではglobal globalDictを解決する方法はありません。マルチプロセッシングとプールを使用しているときに、どのようにグローバル変数にアクセスできますか?

マルチプロセス機能のデータにグローバルにアクセスする簡単な方法はありますか?

私は、次のhereをお読みください。

通信が高価なスレッド間の通信とは対照的に 、プロセス間でデータをやり取りすることははるかに高価であるPythonでは、データが前にバイナリ形式に漬けています。したがって、通信のオーバーヘッドは、タスクが小さい場合には非常に大きくなる可能性があります。無駄なコストを削減するには、チャンク内のタスクをより適切に割り当てる必要があります。

ここに該当するかどうかはわかりませんが、どの場合でもデータアクセスを簡素化したいと思います。

def MPfunction(data): 
    global globalDict 

    data += 1 

    # use globalDict 

    return data 

if __name__ == '__main__': 

    pool = mp.Pool(mp.cpu_count()) 

    try: 
     globalDict = {'data':1} 

     dataList = [0, 1, 2, 3] 
     data = pool.map(MPfunction, dataList, chunksize=10) 

    finally: 
     pool.close() 
     pool.join() 
     pool.terminate() 
+0

のWindowsを

任意のunixyシステムはこのように非常に異なっている(つまり、エラーを発生させるものだならば、あなたが悪いのプールオブジェクトを参照しないように余談として、プールを作成した後tryブロックを開始) 。あなたはどちらを使いますか? – tdelaney

+0

Unix、Python 2.7 – Phillip

答えて

4

Linuxの場合、multiprocessingは、プールワーカーを実行するプロセスの新しいコピーを作成します。このプロセスには、親メモリ空間のコピーオンライトビューがあります。プールを作成する前にglobalDictを割り当てている限り、すでにそのプールが作成されています。そのディクテーションへの変更はすべて子供にとどまることに注意してください。

Windowsでは、新しいインスタンスのpythonが作成され、必要な状態は子プロセスでpickle/unpickleされます。プールを作成してそこにコピーすると、初期化関数を使用できます。これは子プロセスごとに1つのコピーで、マップされたアイテムごとに1回よりも優れています。

import platform 

def MPfunction(data): 
    global globalDict 

    data += 1 

    # use globalDict 

    return data 

if platform.system() == "Windows": 
    def init_pool(the_dict): 
     global globalDict 
     globalDict = the_dict 

if __name__ == '__main__': 
    globalDict = {'data':1} 

    if platform.system() == "Windows": 
     pool = mp.Pool(mp.cpu_count, init_pool(globalDict)) 
    else: 
     pool = mp.Pool(mp.cpu_count()) 

    try: 
     dataList = [0, 1, 2, 3] 
     data = pool.map(MPfunction, dataList, chunksize=10) 
    finally: 
     pool.close() 
     pool.join() 
+0

'def MPfunction(data):'が別のモジュールにある場合にも機能しますか?私はこれを試して、グローバル変数は定義されていません...? – Gabriel

関連する問題