У меня есть следующий код
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) из функции этого класса, происходит только печать внутри обработчика сигнала. Переменные не установлены.