17

バックグラウンド タスクを実行するプロセスを生成するマルチプロセッシング コード (Python 2.6.4、WinXP) を作成しています。いくつかの些細な例で遊んでいると、固定数を生成するように指示しただけなのに、コードが新しいプロセスを継続的に生成するという問題に遭遇しています。

プログラム自体は正常に動作しますが、Windows タスク マネージャーを見ると、新しい 'python.exe' プロセスが表示され続けます。プログラムが実行されるにつれて、それらはますます生成され続けます(最終的には私のマシンを飢えさせます)。


たとえば、
以下のコードは 2 つの python.exe プロセスを起動すると予想します。1 つ目はプログラム自体で、2 つ目はそれが生成する子プロセスです。私が間違っていることは何ですか?

import time
import multiprocessing


class Agent(multiprocessing.Process):
    def __init__(self, i):
        multiprocessing.Process.__init__(self)
        self.i = i

    def run(self):
        while True:
            print 'hello from %i' % self.i
            time.sleep(1)


agent = Agent(1)
agent.start()
4

3 に答える 3

23

ドキュメントのガイドライン、特に「メインモジュールの安全なインポート」について説明しているこのセクションに注意深く従わなかったようです。

起動コードをブロックで保護する必要がありますif __name__ == '__main__':。そうしないと、取得したものを取得できると思います。

マルチプロセッシング モジュールが os.fork() を使用できないことが原因だと思います。Linux では、既に実行中のプロセスが基本的にメモリ内で複製されます。Windows (そのような fork() がない) では、新しい Python インタープリターを実行し、メイン モジュールをインポートするように指示し、それが完了したら start/run メソッドを実行する必要があります。名前チェックで保護されていない「モジュールレベル」のコードがある場合、インポート中にシーケンス全体が無限にやり直されます

于 2009-12-17T21:00:01.630 に答える
0

何も悪いことはありません。Ubuntu 9.10(Python 2.6.4)で正常に動作します。

スクリプトの複数のコピーを開始するcronなどがないことを確認しますか?または、生成されたスクリプトが、新しいインスタンスを開始するものを呼び出していないこと、たとえば、コードがインポート時に直接実行された場合のインポートの副作用としてですか?

于 2009-12-17T18:50:24.060 に答える
0

Linux で python2.6 を使用してこれを実行すると、最大 4 つの python2.6 プロセスが表示され、それらがすべてこのプロセスからのものであるとは保証できません。彼らは間違いなくマシンをいっぱいにしていません。

新しい python バージョンが必要ですか? Linux と Windows の違いは?

于 2009-12-17T18:43:10.913 に答える