gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 05:29:21 27 4
gpt4 key购买 nike

使用这个例子,我想捕获信号。并在类中打印 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com