2013-12-17 56 views
1

使用此示例,我想捕獲信號。並在類中打印var。mulitprocess.process類中的信號處理程序,無法獲取類的val

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蟒蛇2.7答案是這樣的:

蟒蛇test.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殺死的時候。信號處理器 defun在父代中,將迭代它的子進程列表來殺死它。並在__init__樂趣註冊。孩子列表進入run()就像這個例子一樣有趣。 我打印自我的id。當處理程序被調用時,自我是一樣的。不過,self.a與 不同。 作爲打印演示,運行被稱爲first,然後處理程序.so self.a應該是相同的? 那麼,這裏有什麼問題?

回答

2

如果您嘗試打印捕獲並處理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) 
+0

謝謝。你是對的。我曾嘗試將__init__函數放入函數中。事實上,在調用start()後創建了進程。 – jiamo