从正在运行的进程中调用函数

时间:2009-09-08 10:38:49

标签: python ipc subprocess

我的程序启动一个子进程,它必须在初始化后向父进程发送某种信号。如果我可以在父节点中设置处理程序,那将是完美的,在发送此信号时调用该处理程序。有没有办法做到这一点?

Alendit

3 个答案:

答案 0 :(得分: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,请不要绝望 - 可以使用backport here

答案 1 :(得分: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)手册页。

答案 2 :(得分:1)

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