2017-08-12 3 views
0

私はこのコードを持っている:私はこれを実行するとターゲット・ファンクションの外部でマルチプロセスが実行されているのはなぜですか?

import multiprocessing 
with open('pairs.txt') as f: 
    pairs = f.read().splitlines() 

print(pairs) 


def worker(pairtxt): 
    print(pairtxt) 

if __name__ == '__main__': 
    jobs = [] 
    for i in pairs: 
     p = multiprocessing.Process(target=worker, args=(i,)) 
     jobs.append(p) 
     p.start() 

、それは私が自分自身で一度推測し、二回マルチプロセッシングではなく、なぜそれがさらに外に実行されているよ、3回(pairtxtない)のペアは、可変出力ターゲット関数?

私の出力は、私が2行 "1" と "2" を含むpairs.txtを取得しています

['1', '2'] 
['1', '2'] 
1 
['1', '2'] 
2 
+0

達成しようとしていることは何ですか?私たちはpairs.txtの中に何が入っているのか分かりません:) –

+0

関数だけで実行されるプロセスでは、 "for i in pairs"によって割り当てられた行を出力しますが、これはうまくいきますが、関数の外で実行されていると私のスクリプト全体を実行しているようだ。 pairs.txtの内部は単純な言葉の2行です。 – gregz11818

+0

私はpairs = [1,2]を使用し、コードを実行し、最初に "1"を出力し、次に "2"を出力しました。 –

答えて

1

あなたif __name__ == '__main__'ブロックにwith openprint(pairs)文を移動してみてください。

私は、サブプロセスが呼び出されるたびにpythonが完全なスクリプトを実行していると考えています。それは、それを渡す関数のすべての依存関係が確実に満たされるようにするためです。あなたのmainブロックの外にあるあなたのスクリプト内でコードを実行することによって、それはあなたのサブプロセスが実行されるたびに実行されます。

import multiprocessing 
def worker(pairtxt): 
    print(pairtxt) 

if __name__ == '__main__': 
    with open('pairs.txt') as f: 
     pairs = f.read().splitlines() 

    print(pairs) 
    jobs = [] 
    for i in pairs: 
     p = multiprocessing.Process(target=worker, args=(i,)) 
     jobs.append(p) 
     p.start() 
0

Pythonは動的言語なので、モジュールをインポートするとき、そのモジュール内のすべての最上位ステートメントが実行されます。あなたが通常気づいていない理由は、多くのモジュールが動作を宣言するか、アクションを実行する前にそれらがメインモジュールであるかどうかを少なくとも確認することだけです。

この例では、ワーカー関数を定義する前に、ファイルをロードして内容を印刷する完全無条件のセクションがあります。これは、マルチプロセッシングでプロセスごとに1回実行される場合と実行されない場合があります。モジュールを新たにインポートするのではなく、単に既存のプロセスを複製できるので、forkが利用できるunixlikesにはなりません。

これはSafe importing of main moduleの下に文書化されており、頻繁にマルチプロセッシングの問題があります。

関連する問題