python - multiprocess.process 类中的信号处理程序,无法获取类的 val

标签 python signals multiprocessing

使用这个例子,我想捕获信号。并在类中打印 var。

import signal
import time
import multiprocessing

class test(multiprocessing.Process):
    def __init__(self):
        super(test,self).__init__()
        self.a = []

    def handle(self,sig,frm):
        print "in hander  selfid    " , id(self)
        print "in handler self.a    " , self.a
        print "in handler self.a id " , id(self.a)

    def run(self):

        self.a = [1 ,2] 
        print "in run selfid        " , id(self)
        print "in run self.a id     " , self.a 
        print "in run self.a id is  " , id(self.a)
        while 1:
            time.sleep(10)

test_1 = test()

signal.signal(signal.SIGALRM,test_1.handle)
test_1.run()
time.sleep(2)

signal.alarm(1)

使用 ubunut12.04 python 2.7 答案如下:

python 测试.py

in run selfid         139880313607120
in run self.a id      [1, 2]
in run self.a id is   139880313975872
in hander  selfid     139880313607120
in handler self.a     []
in handler self.a id  139880313580432

虽然我期待答案:

in handler self.a is [1,2]

signal.signal(signal.SIGALRM,test_1.handle) 放入 self.__init__ 中也不起作用。

我使用这个方法来获取:当父进程被 SIGTERM 杀死时。信号处理程序 Parent 中的 defun ,将迭代其子进程列表以杀死它。并将其注册到__init__ fun中。子列表像示例一样获得 run() 的乐趣。 我打印了 self 的 id。当处理程序被调用时, self 是相同的。然而, self.a 是 不同的 。 正如打印所示,首先调用了 run,然后调用了 handler.so self.a 应该相同吗? 那么,这里有什么问题?

最佳答案

如果您尝试打印捕获并处理 SIGALRM 的进程的 PID,您将看到它是父进程,而不是子进程:

    ...
    def handle(self,sig,fem):
        print "in handler pid: ", os.getpid()

...
signal.signal(signal.SIGALRM,test_1.handle)
test_1.start()
print "Parent PID: ", os.getpid()
print "Child PID: ", test_1.pid
...

输出:

Parent PID:  3137
Child PID:  3138
...
in handler pid:  3137 <-- parent
...

您需要修改代码以便:

  1. 信号处理程序设置在子进程内部
  2. 信号被发送到子进程
class test(multiprocessing.Process):
    ...
    def handle(self,sig,fem):
        ...

    def run(self):
        signal.signal(signal.SIGALRM, self.handle)
        ...

...
test_1.start()
time.sleep(2)

os.kill(test_1.pid, signal.SIGALRM)

关于python - multiprocess.process 类中的信号处理程序,无法获取类的 val,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20634937/

相关文章:

python - 在 Python 中生成给定游戏列表的可能组合

python - Pandas :按自定义类别分组,然后进行透视?

python - 日期时间 - 10 小时

windows - 如何为windows cmd实现ctrl+l?

Python:检测物理非 HT CPU 的跨平台解决方案?

python - 在python中使用threading/multiprocessing同时进行多个计算

python - 如何用字典修复多线程/多处理?

python - 如何更改 virtualenv 中依赖项应用程序中的模型

不调用 PHP pcntl_signal 回调

matlab - Matlab 中信号的扭曲片段