2009-09-08 37 views
0

我的程序启动了一个子进程,它在初始化之后必须向父进程发送某种信号。如果我可以在父项中设置一个处理程序,在发送此信号时调用它,这将是完美的。有什么办法可以做到吗?从正在运行的进程中调用函数

Alendit

回答

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,不要绝望 - 一个补丁包,可用here

+0

非常感谢,首先我有点害怕,因为我实际上必须用python2.5来做,但后台运行得很好。 – user164039 2009-09-10 10:20:04

1

您可以使用signal module Python标准库注册一个信号处理程序。该子过程然后将使用正常的信号发送机制。

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系统,当使用建立的 处理程序信号()被 传递信号调用,信号的配置 将被重置为 SIG_DFL,并且系统没有 块传递信号的其他实例 。 System V还为信号()提供了 这些语义。这 是坏的,因为在处理程序 有机会重新建立自己之前,信号可能会再次发送 。 此外,相同信号的快速交付可能导致处理程序的递归调用 。

我推荐阅读整个signal(2)手册页。

+0

如果有办法将参数发送到父函数,那么您的解决方案将是完美的。 – user164039 2009-09-08 13:20:17

+0

随着我的回答,有:-) – 2009-09-08 14:35:29