0

問題:子供がタイムアウトして完了することを期待しています。しかし、代わりにタイムアウトして、再び実行を開始します。

このプログラムが永遠に実行される理由を誰かに教えてもらえますか?一度実行して終了することを期待しています...

これが実用的なプログラムです。マスターは、子を生成する関数をスレッド化します。ループしてしまうことを除けば、うまく機能します。

これがマスターです:

# master.py
import multiprocessing, subprocess, sys, time

def f():
    p = subprocess.Popen(["C:\\Python32\\python.exe", "child.py"])
    # wait until child ends and check exit code
    while p.poll() == None:
        time.sleep(2)
    if p.poll() != 0:
        print("something went wrong with child.py")

# multithread a function process to launch and monitor a child
p1 = multiprocessing.Process(target = f())
p1.start()

と子供:

# child.py
import socket, sys

def main(args):
    try:
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        sock.settimeout(10)
        sock.bind(('', 54324))
        data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
        print(data)
        sock.close()
        return 0
    except KeyboardInterrupt as e:
        try:
            sock.close()
            return 0
        except:
            return 0

if __name__ == "__main__":
    sys.exit(main(sys.argv))
4

1 に答える 1

1

問題は、ガードmaster.pyがないことです。if __name__ == '__main__'Windows では、子プロセスでモジュールmultiprocessingを再インポートできるmain必要があり、このガードを使用しない場合、子プロセスでifを再実行しますmultiprocessing.Process(偶発的な forkbomb が発生します)。

修正するには、すべてのコマンドをガードに入れるだけmaster.pyですif

if __name__ == '__main__':
    # multithread a function process to launch and monitor a child
    p1 = multiprocessing.Process(target = f())
    p1.start()
于 2012-09-21T02:28:09.873 に答える