我的程序启动了一个子进程,它在初始化之后必须向父进程发送某种信号。如果我可以在父项中设置一个处理程序,在发送此信号时调用它,这将是完美的。有什么办法可以做到吗?从正在运行的进程中调用函数
Alendit
我的程序启动了一个子进程,它在初始化之后必须向父进程发送某种信号。如果我可以在父项中设置一个处理程序,在发送此信号时调用它,这将是完美的。有什么办法可以做到吗?从正在运行的进程中调用函数
Alendit
如果您使用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,不要绝望 - 一个补丁包,可用here。
您可以使用signal module Python标准库注册一个信号处理程序。该子过程然后将使用正常的信号发送机制。
父代码:
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系统,当使用建立的 处理程序信号()被 传递信号调用,信号的配置 将被重置为 SIG_DFL,并且系统没有 块传递信号的其他实例 。 System V还为信号()提供了 这些语义。这 是坏的,因为在处理程序 有机会重新建立自己之前,信号可能会再次发送 。 此外,相同信号的快速交付可能导致处理程序的递归调用 。
我推荐阅读整个signal(2)
手册页。
如果有办法将参数发送到父函数,那么您的解决方案将是完美的。 – user164039 2009-09-08 13:20:17
随着我的回答,有:-) – 2009-09-08 14:35:29
非常感谢,首先我有点害怕,因为我实际上必须用python2.5来做,但后台运行得很好。 – user164039 2009-09-10 10:20:04