0

複数のサブプロセス (小さな TCP サーバーを実装する各 python スクリプト) を起動して強制終了できる python スクリプトを作成し、実行中にそれらから出力を取得したいと考えています。これには特定のモジュールがありますか、それとも先に進んでサブプロセスを使用する必要がありますか?

4

2 に答える 2

0

それらからの出力の取得は、サブプロセスが書き込むテキストファイルを読み取ることで実行できます..または、Pickle本質的に同じものを使用できます..

使用例:

child_count=pickle.load( open("child_count.p", "rb"))
child_count-=counter
pickle.dump( child_count, open("child_count.p", "wb"))

あなたのtcpサーバーの場合..新しいプロセスを「起動」し、プロセスが完了すると、リスナーが再び強制終了されるというアイデアがあると思います。

def reap():
    #Collect child processes
    while 1:
        try:
            result = os.waitpid(-1, os.WNOHANG)
            if not result[0]: break
        except:
            break
        print "Reaped child process %d" % result[0]

host = ''
port = 4200

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host, port))
s.listen(1)

print "Parent at %d listening for connections" % os.getpid()
while 1:



    try:
        clientsock, clientaddr = s.accept();clientsock.settimeout(90)
        print "Accepting connection"
    except KeyboardInterrupt:
        raise
    except:
        traceback.print_exc()
        continue

    reap()

    #Clone/fork
    try:
        pid = os.fork()
    except:
        print "SOMETHING BAD HAPPENED.. fork failed!"
        clientsock.close()
        continue

    if pid:
        clientsock.close()
        #Cleanup old children
        continue
    else:
        print "New child", os.getpid()
        s.close()

        #try:
        print "Got connection frommm: ", clientsock.getpeername()
        data = clientsock.recv(1024)

        <ENTER your code for the process here>

これは、サーバーのコアになる可能性があります。

それが何をするか、それは接続を受け入れ、次に自分自身をフォークし、フォーク/クローンされた部分がプロセスを処理する間、他の着信接続をリッスンし続けます。

他のプロセスが完了している間に新しい接続が入ると、そのプロセスはゾンビ プロセスとして認識され、リープされます。

于 2013-06-10T07:37:49.033 に答える
0

multiprocessing モジュールを探しているようです。インターフェースはthreading モジュールのものと似ています。

各プロセスを手動で起動する、 Pool で管理できます。

それらは、Pipe または Queueを使用して通信できます。または、より簡単にManager オブジェクトを使用して通信できます。

于 2013-06-10T07:31:38.680 に答える