私のプログラムはサブプロセスを開始します。サブプロセスは、初期化後にある種のシグナルを親に送信する必要があります。このシグナルが送信されたときに呼び出されるハンドラーを親に設定できれば、完了です。それを行う方法はありますか?
アレンディット
私のプログラムはサブプロセスを開始します。サブプロセスは、初期化後にある種のシグナルを親に送信する必要があります。このシグナルが送信されたときに呼び出されるハンドラーを親に設定できれば、完了です。それを行う方法はありますか?
アレンディット
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 を使用している場合でも、絶望しないでください。ここでバックポートを利用できます。
親コード:
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 ページ全体を読むことをお勧めします。
Python標準ライブラリのシグナルモジュールを使用して、シグナルハンドラーを登録できます。その後、サブプロセスは通常の信号送信メカニズムを使用します。