9

main.py のクラス メソッドを呼び出す jobrunner.py というスクリプトがあります。下記参照...

# 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 プラットフォームのモジュール間で渡されていないと思います。他の誰かがこのようなものを見て、それを修正する方法を知っていますか?

アダム

更新:完全なハックかもしれませんが、私はそれを理解しました...以下を参照してください!

# 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()
4

1 に答える 1

22

親プロセスで設定したグローバル変数の値が子プロセスに自動的に反映されるとは思わないでください。

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

これは Windows には当てはまりません。子がアクセスする必要がある親プロセスのすべての変数は、明示的に渡すか、共有メモリに配置する必要があります。

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

于 2011-07-06T12:54:47.353 に答える