2

私が発見したように、マルチプロセッシングに関しては、ウィンドウはちょっとしたブタであり、それについて質問があります。

pydocは、マルチプロセッシングを使用する場合は、Windowsアプリケーションのエントリポイントを保護する必要があると述べています。

これは、新しいプロセスを作成するコードのみを意味しますか?

例えば

スクリプト1

import multiprocessing

def somemethod():
    while True:
        print 'do stuff'

# this will need protecting
p = multiprocessing.Process(target=somemethod).start()

# this wont
if __name__ == '__main__':
    p = multiprocessing.Process(target=somemethod).start()

このスクリプトでは、プロセスを生成する行があるため、これをメインの場合にラップする必要があります。 しかし、もしあなたが持っていたらどうでしょうか?

スクリプト2

file1.py

import file2
if __name__ == '__main__':
    p = Aclass().start()

file2.py

import multiprocessing
ITEM = 0
def method1():
    print 'method1'

method1()

class Aclass(multiprocessing.Process):
    def __init__(self):
        print 'Aclass'
        super(Aclass, self).__init__()

    def run(self):
        print 'stuff'

この場合、何を保護する必要がありますか? ファイル2にif__main__があった場合、プロセスが作成されている場合、この中のコードは実行されますか?

注:コードがコンパイルされないことはわかっています。これは単なる例です。

4

1 に答える 1

5

pydocは、マルチプロセッシングを使用する場合は、Windowsアプリケーションのエントリポイントを保護する必要があると述べています。

私の解釈は異なります:ドキュメントには

メインモジュールは、意図しない副作用(新しいプロセスの開始など)を引き起こすことなく、新しいPythonインタープリターによって安全にインポートできます。

したがって、モジュール(import mymodule)をインポートしても、新しいプロセスは作成されません。つまり、プロセス作成コードを保護することで、プロセスの開始を回避できます。

if __name__ == '__main__':
    ...

...のコードは、プログラムがメインプログラムとして実行されている場合、つまり、実行している場合にのみ実行されるためです。

python mymodule.py

または、実行可能ファイルとして実行する場合。ただし、ファイルを実行する場合は実行できませんimport

したがって、:noに関する質問に答えるには、file2の間にプロセスが開始されないため、保護は必要ありませんimport file2

また、を入力するif __name__ == '__main__'と、インポートされ、メインプログラムとして実行されないfile2.pyため、実行されません。file2

編集: これは、プロセス作成コードを保護しない場合に発生する可能性のある例です。ループして大量のプロセスを作成する可能性があります。

于 2012-11-23T17:55:06.450 に答える