Я пытаюсь запустить несколько запросов API параллельно с многопроцессорной обработкой. Процесс и запросы.Я поместил URL для анализа в экземпляр JoinableQueue и вернул содержимое в экземпляр Queue.Я заметил, что помещение response.content в очередь каким-то образом предотвращает завершение процесса.
Вот упрощенный пример с одним процессом (Python 3.5):
import multiprocessing as mp
import queue
import requests
import time
class ChildProcess(mp.Process):
def __init__(self, q, qout):
super().__init__()
self.qin = qin
self.qout = qout
self.daemon = True
def run(self):
while True:
try:
url = self.qin.get(block=False)
r = requests.get(url, verify=False)
self.qout.put(r.content)
self.qin.task_done()
except queue.Empty:
break
except requests.exceptions.RequestException as e:
print(self.name, e)
self.qin.task_done()
print("Infinite loop terminates")
if __name__ == '__main__':
qin = mp.JoinableQueue()
qout = mp.Queue()
for _ in range(5):
qin.put('http://en.wikipedia.org')
w = ChildProcess(qin, qout)
w.start()
qin.join()
time.sleep(1)
print(w.name, w.is_alive())
После запуска кода я получаю:
Завершается бесконечный цикл
ChildProcess-1 True
Пожалуйста, помогите понять, почему процесс не завершается после выхода из функции запуска.
Обновление: добавлен оператор печати, чтобы показать, что цикл завершается