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

Posted

技术标签:

【中文标题】从正在运行的进程中调用函数【英文标题】:Call a function from a running process 【发布时间】:2009-09-08 10:38:49 【问题描述】:

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

阿伦迪特

【问题讨论】:

【参考方案1】:

如果您使用的是 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。

【讨论】:

非常感谢,一开始我有点害怕,因为我实际上必须使用 python2.5 来做,但是向后移植工作得很好。【参考方案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) 手册页。

【讨论】:

如果有办法将参数发送到父函数,您的解决方案将是完美的。【参考方案3】:

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

【讨论】:

以上是关于从正在运行的进程中调用函数的主要内容,如果未能解决你的问题,请参考以下文章

从Python中其他进程中运行的函数调用类方法

如何从 C# 应用程序远程调用另一个进程方法

在 C 编程中,如何 fork() 在子进程中运行 N 个函数调用?

单独进程中的PHP调用函数

在 qthread 中停止长时间运行的进程

Linux 进程详解