Невозможно установить атрибуты экземпляра в обработчике сигналов Python

У меня есть следующий код

def signal_handler(self,signum,frame):
            self.kill_received = True
            print "signal received",signum
            self.condition.set()

def mainFunc(self):
     while not self.kill_received:
          * do something *

Было замечено, что когда фактические сигналы поднимаются, signal_handler печатает сигнум, но цикл продолжается. Я даже пытался напечатать значение self.kill_received внутри цикла. Он показал false даже после выполнения обработчика сигнала.

Кроме того, если я помещу отпечаток self.kill_received в обработчик сигнала, я увижу, что он стал True. Но это не отражается снаружи. Даже если я вызываю функцию из обработчика сигнала, она отражает измененное значение kill_received. Как будто есть два параллельных адресных пространства или что-то для основного процесса и обработчиков сигналов (не уверен, так как я новичок в Python, и его внутренняя работа не известна)

Может ли кто-нибудь объяснить такое поведение переменных экземпляра в Python? Я пытался использовать «global kill_received», но он выдает «неопределенные» ошибки.

Вот весь код по запросу

 class CreateData(multiprocessing.Process):

     def __init__(self, recv_queue, reportName, reportDirectory, condition, chunkSize = 100, maxReportSize = 350, isChunked = True):
            multiprocessing.Process.__init__(self)
            self.reportName = reportName
            self.reportDirectory = reportDirectory
            self.recv_queue = recv_queue

            self.chunkSize = chunkSize * 1024 * 1024
            self.maxReportSize = maxReportSize * 1024 * 1024
            self.current_chunk_size = 0
            self.isChunked = isChunked
            self.chunk_suffix = 0


            # Flow control attributes
            signal.signal(signal.SIGTERM,self.signal_handler)
            signal.signal(signal.SIGUSR1,self.signal_handler)
            self.kill_received = False
            self.condition = condition

    def signal_handler(self,signum,frame):
            self.kill_received = True
            print "signal received",signum
            self.condition.set()


    def run(self):
            self.makeReport(True)

    def makeReport(self,isChunked):
             swing=20*(self.chunkSize/100)
             up_swing=(self.chunkSize+swing)  #upper swing size
             low_swing=(self.chunkSize-swing) #lower swing size

             while(not self.kill_received):
             #{
                 self.funcTest()     
             #}

EDIT Эта проблема возникает только тогда, когда сигнал инициируется функцией внутри этого класса. Если я делаю os.kill(child_pid,signal) из основного процесса, он обрабатывается, как и ожидалось.

Но когда я выполняю os.kill(os.ppid(),signal) из функции этого класса, происходит только печать внутри обработчика сигнала. Переменные не установлены.


person Vivek    schedule 17.05.2012    source источник
comment
Можете ли вы показать код, где вы регистрируете обработчик сигнала?   -  person Hampus Nilsson    schedule 17.05.2012
comment
signal.signal(signal.SIGUSR1,self.signal_handler) внутри init   -  person Vivek    schedule 17.05.2012
comment
Не могли бы вы опубликовать код для всего класса или, возможно, всего модуля?   -  person bpgergo    schedule 17.05.2012
comment
вопрос отредактирован, чтобы добавить весь модуль   -  person Vivek    schedule 17.05.2012
comment
def makeReport, это должно быть внутри CreateData? И цикл внутри него, разве не должен быть self. перед kill_received?   -  person XORcist    schedule 17.05.2012
comment
да жаль, что это было там. я изменил для тестирования глобальной вещи. и да, makeReport является частью CreateData..   -  person Vivek    schedule 17.05.2012
comment
возможно связанные stackoverflow.com/questions /9916301/   -  person mgilson    schedule 17.05.2012
comment
проблема, упомянутая в приведенном выше URL-адресе, связана с использованием обработчиков сигналов для обработки прерывания клавиатуры, что не будет работать нормально. прерывание клавиатуры вызывает исключение. здесь мой обработчик сигналов вызывается правильно. только установка переменных не работает нормально. простите. отношения не вижу..   -  person Vivek    schedule 17.05.2012
comment
Основываясь на моем ограниченном опыте в этих вещах, сигналы не обрабатываются должным образом в многопроцессорной обработке. (Конечно, хотелось бы ошибаться в этом)   -  person mgilson    schedule 17.05.2012
comment
хм, я попробую без многопроцессорного контекста. но даже тогда это не решает моих проблем :(   -  person Vivek    schedule 17.05.2012
comment
@Vivek, вызов KeyboardInterrupt - это просто действие по умолчанию, которое выполняется, когда ваша программа получает SIGINT. В этой ссылке я пытался обработать SIGINT с помощью сигналов, а также try/except... ничего не получилось. Но опять же, я не эксперт по обработке сигналов в python (или где-либо еще), поэтому я хотел бы, чтобы кто-то, кто знает больше меня, доказал свою неправоту.   -  person mgilson    schedule 17.05.2012
comment
из того, что я прочитал, я понял, что python внутренне вызывает KeyboardInterrupt до того, как SIGINT достигнет нашего процесса. отсюда и мое заявление. Думаю, здесь не нужно отклоняться от темы. :)   -  person Vivek    schedule 17.05.2012