Уничтожить дочерний процесс, блокирующий очередь - PullRequest
0 голосов
/ 03 октября 2019

У меня есть класс, который определяет очередь и запускает количество рабочих в фоновом режиме:

class WorkerMaster:
    def __init__(self):
        self.workers = []

    def listen(self):
        queue = Queue()
        self.init_workers(queue)

        while True:
            data = fetchData() # Fetches data from somewhre
            queue.put(data)

    def init_workers(self, queue):
        for i in range(5):
            worker = Worker(queue)

            self._workers.append(worker)

            worker.daemon = True
            worker.start()

Как вы можете видеть, Мастер в основном производитель. Он извлекает данные откуда-то и добавляет их в очередь.

Это метод запуска рабочего класса, который наследуется от Process:

def run(self):
    try:
        super().run()

        while True:
            data = self.queue.get()
            self.process(data)

Проблема в том, что get () вызов блокируется, и когда я пытаюсь уничтожить основной процесс, сначала уничтожается очередь, а в дочернем процессе я получаю такие ошибки, как эта, потому что очередь не существует:

  File "C:\python\python\3.7.1\lib\multiprocessing\queues.py", line 94, in get
    res = self._recv_bytes()
  File "C:\python\python\3.7.1\lib\multiprocessing\connection.py", line 216, in recv_bytes
    buf = self._recv_bytes(maxlength)
  File "C:\python\python\3.7.1\lib\multiprocessing\connection.py", line 306, in _recv_bytes
    [ov.event], False, INFINITE)

Иэто останавливает основной процесс, не позволяя ему правильно завершиться. Как я могу решить проблему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...