0

私のプログラムはサブプロセスを開始します。サブプロセスは、初期化後にある種のシグナルを親に送信する必要があります。このシグナルが送信されたときに呼び出されるハンドラーを親に設定できれば、完了です。それを行う方法はありますか?

アレンディット

4

3 に答える 3

4

Python 2.6 を使用している場合はmultiprocessing、標準ライブラリのモジュール、特にパイプとキューを使用できます。ドキュメントからの簡単な例:

from multiprocessing import Process, Pipe

def f(conn): #This code will be spawned as a new child process
    conn.send([42, None, 'hello']) #The child process sends a msg to the pipe
    conn.close()

if __name__ == '__main__':
    parent_conn, child_conn = Pipe()
    p = Process(target=f, args=(child_conn,)) # prepare to spawn the child
    p.start() # spawn it
    print parent_conn.recv()   # prints "[42, None, 'hello']"
    p.join() #wait for child to exit

Python 2.4 または 2.5 を使用している場合でも、絶望しないでください。ここでバックポートを利用できます

于 2009-09-08T11:49:08.763 に答える
2

親コード:

import signal

def my_callback(signal, frame):
    print "Signal %d received" % (signal,)

signal.signal(signal.SIGUSR1, my_callback)
# start child

子コード:

import os
import signal

signal.kill(os.getppid(), signal.SIGUSR1)

次のような問題があるため、この形式の IPC には注意してください。

元の Unix システムでは、signal() を使用して確立されたハンドラーがシグナルの配信によって呼び出されると、シグナルの処理は SIG_DFL にリセットされ、システムはシグナルのそれ以降のインスタンスの配信をブロックしませんでした。System V は、signal() のこれらのセマンティクスも提供します。これは、ハンドラーが自身を再確立する機会を得る前にシグナルが再度配信される可能性があるため、問題がありました。さらに、同じシグナルを迅速に配信すると、ハンドラーが再帰的に呼び出される可能性があります。

signal(2)man ページ全体を読むことをお勧めします。

于 2009-09-08T11:00:27.160 に答える
1

Python標準ライブラリのシグナルモジュールを使用して、シグナルハンドラーを登録できます。その後、サブプロセスは通常の信号送信メカニズムを使用します。

于 2009-09-08T10:44:05.540 に答える