Я не понимаю, почему следующие блоки кода. Я пытаюсь просто зациклиться на заданное время, а затем отправить сообщение в поток, чтобы он остановился. Мой класс процесса выглядит следующим образом.
class Worker(multiprocessing.Process):
def __init__(self, queue):
multiprocessing.Process.__init__(self)
self.queue = queue
self.running = True
def run(self):
print 'entered run'
while self.running:
print 'thread time:', time.time()
time.sleep(.6)
print 'thread end'
return 0
Довольно прямолинейно. Мой основной выглядит так:
if __name__ == '__main__':
queue = Queue()
p = Worker(queue)
p.daemon = True
p.start()
time.sleep(3)
p.running = False
print 'Main end'
Итак, что я ожидаю от этой программы, так это запуск процесса, который будет выполнять свой собственный цикл наряду с основным. Пока это происходит, Main()
будет спать в течение 3 секунд, а затем установит для условия цикла внутри рабочего процесса значение False, чтобы он вышел из цикла. Затем они оба печатают приятное сообщение «Готово», и программа завершает работу. Однако проблема в том, что поток main
завершает работу до того, как процесс успевает отобразить свое сообщение.
Например, вывод выглядит так:
>> entered run
>> thread time: 1358444245.31
>> thread time: 1358444245.91
>> thread time: 1358444246.51
>> thread time: 1358444247.11
>> thread time: 1358444247.71
>> Main end
Итак, немного почитав, я вижу, что join()
используется для блокировки, пока поток не завершит выполнение. После этого я добавляю вызов join()
сразу после нарушения условия цикла в потоке. Я думаю, что это заблокирует main, пока процесс не успеет закрыться.
if __name__ == '__main__':
queue = Queue()
p = Worker(queue)
p.daemon = True
p.start()
time.sleep(3)
p.running = False
p.join() ## <------ New Line
print 'Main end'
Однако это ведет себя неожиданно. Как только я добавляю эту строку, поток никогда прекращает выполнение, и поэтому main блокируется на неопределенный срок. Вывод ниже будет вращаться в вечность.
>> entered run
>> thread time: 1358444362.44
>> thread time: 1358444363.04
>> thread time: 1358444363.64
>> thread time: 1358444364.24
>> thread time: 1358444364.84
>> thread time: 1358444365.44
>> thread time: 1358444366.04
>> thread time: 1358444366.64
>> thread time: 1358444367.24
>> thread time: 1358444367.84
>> thread time: 1358444368.44
>> thread time: 1358444369.04
>> thread time: 1358444369.64
>> thread time: 1358444370.24
Что тут происходит? Почему, когда я добавляю join()
, моя нить не выходит из цикла?