2011-07-06 8 views
6

私はmain.pyのクラスメソッドを呼び出すjobrunner.pyというスクリプトを持っています。下記を参照してください...WindowsとLinuxの間のPythonマルチプロセスdiff

# jobrunner.py 
from multiprocessing import Process 
import main 
from main import BBOX 

def _a(arg): 
    f = main.a() 
    print f.run() 

def _b(arg): 
    p = main.b() 
    print p.run() 

if __name__ == '__main__': 
    world = '-180,180,-90,90' 
    BBOX.append(world.split(',')) 

    p1 = Process(target=_a, args=("1",)) 
    p2 = Process(target=_b, args=("1",)) 

    p1.start() 
    p2.start() 

    p1.join() 
    p2.join() 

プロセスの_a及び_bはOSXとUbuntu上で問題なく起動されますが、私はWindows上で同じこと(Pythonとすべての同じバージョン)を実行しようとすると、そのインデックスを言って失敗します範囲外です。これは、 "グローバル"変数BBOXがWindowsプラットフォーム上のモジュール間で設定または渡されていないと考えています。他の誰かがこのようなことを見て、それを修正する方法を知っていますか?

アダム

UPDATE:私はそれは下記を参照してください...総ハックかもしれないにもかかわらず、それを考え出しました!

# jobrunner.py 
from multiprocessing import Process 
import main 
from main import BBOX 

def _a(arg): 
    BBOX.append(arg) #This is the key 
    f = main.a() 
    print f.run() 

def _b(arg): 
    BBOX.append(arg) #This is the key 
    p = main.b() 
    print p.run() 

if __name__ == '__main__': 
    world = '-180,180,-90,90' 
    BBOX.append(world.split(',')) 

    p1 = Process(target=_a, args=(BBOX[0],)) 
    p2 = Process(target=_b, args=(BBOX[0],)) 

    p1.start() 
    p2.start() 

    p1.join() 
    p2.join() 

答えて

12

あなたは親プロセスに設定されているグローバル変数の値が自動的に子プロセスに伝播することを期待してはいけません。

これらのプラットフォームではmultiprocessingfork()を使用するため、コードはUnixライクなプラットフォームで動作します。これは、すべての子プロセスがすべてのグローバル変数を含む親プロセスのアドレス空間のコピーを取得することを意味します。

これはWindowsでは該当しません。子プロセスがアクセスする必要がある親プロセスからのすべての変数は、明示的にpassed down or placed in shared memoryでなければなりません。

これを実行すると、コードはUnixとWindowsの両方で動作します。

+0

本当に正しい方向に向かいますが、共有メモリにリストを渡す必要があります。この場合、私はBBOXとして設定している[['57'、 '78'、 '23'、 '40']]リストのようなものになります。リストにはc_typeはありません。 – aeupinhere

関連する問題