Вы создаете процесс http-сервера, но не join()
. Что произойдет, если вместо выполнения os.kill()
для остановки процесса http-сервера вы отправите ему дозорный сигнал остановки обработки (None
, как вы отправляете рабочим), а затем выполните self.http.join()
?
Обновление : Вам также необходимо отправить None
стражу во входную очередь один раз для каждого рабочего . Вы можете попробовать:
for w in self.workers:
self.i_queue.put(None)
for w in self.workers:
w.join()
N.B. Причина, по которой вам нужны два цикла, состоит в том, что если вы поместите None
в очередь в том же цикле, который выполняет join()
, то None
может быть получен работником, отличным от w
, поэтому присоединение к w
вызовет блокировку вызывающего абонента.
Вы не показываете код для рабочих или http-сервера, поэтому я предполагаю, что они хорошо себя ведут с точки зрения вызова task_done и т. Д., И что каждый рабочий завершит работу, как только увидит None
, без get()
-ing больше вещей из очереди ввода.
Также обратите внимание, что существует по крайней мере одна открытая, трудно воспроизводимая проблема с JoinableQueue.task_done()
, которая может вас кусать.