使用这个例子,我想捕获信号。并在类中打印 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
...
您需要修改代码以便:
- 信号处理程序设置在子进程内部
- 信号被发送到子进程
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/