multiprocessing.Process не завершается после помещения запросов response.content в очередь - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь запустить несколько запросов 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

Пожалуйста, помогите понять, почему процесс не завершается после выхода из функции запуска.

Обновление: добавлен оператор печати, чтобы показать, что цикл завершается

1 Ответ

0 голосов
/ 23 мая 2018

Добавьте вызов к w.terminate () над сообщением печати.


Относительно того, почему процесс не завершается сам;Ваш код функции представляет собой бесконечный цикл, поэтому он никогда не возвращается.Вызов прекращения сигнализирует процессу о самоубийстве.

...