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

class Executor:
    pool: ThreadPool

    def __init__(self, pool_size: int):
        self.pool = ThreadPool(pool_size)

    def start(self):
        while True:
            self.refresh_args()
            self.pool.map(self.handler, self.args)
            self.pool.join()

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

Как реализовать эту логику? Или, может быть, мне стоит поискать другой способ без использования ThreadPool? Как это реализовано в другом ПО?

1
Шах 14 Сен 2020 в 12:03

1 ответ

Лучший ответ

Вы можете сделать это, используя multiprocessing.Queue, передав количество задач как максимальное количество элементов в очереди.

Когда вы помещаете что-то в очередь, этот поток продолжает ждать, пока он не окажется в очереди. В то же время вы можете сделать свою петлю как

while True:
    queue.get() # blocks if queue is empty

И поместите каждый элемент в новый поток:

class Executor:
    pool: ThreadPool

    def __init__(self, pool_size: int):
        self.elements = multiprocessing.Queue(pool_size)

    def start(self):
        while True:
            self.refresh_args()
            element = self.elements.get() # blocks if queue is empty
            # put element in new thread
            # when task is finished, put new element in queue
2
JPery 14 Сен 2020 в 09:28