Начать новый процесс, не дожидаясь завершения всех других процессов - PullRequest
0 голосов
/ 04 июля 2019

Если я запускаю несколько процессов, как это:

        procs = []
        for agent_id in agents:
            proc = Process(target=beginmultiproc, args=(id))
            procs.append(proc)
            proc.start()

        # wait for processes to finish
        for proc in procs:
            proc.join()

Есть ли способ, которым я могу начать новый процесс, как только он закончится, вместо того, чтобы ждать, пока все завершат? Я хочу запускать 8 процессов одновременно, так как это количество ядер, которое имеет мой ЦП, но у меня есть более 8 заданий, которые мне нужно запустить, поэтому, как только один процесс завершится, я хочу запустить следующий процесс.

Мне известно о pool.map, но я не могу использовать его в этом случае.

Ответы [ 2 ]

1 голос
/ 04 июля 2019

Вы также можете взглянуть на ProcessPoolExecutor , который, если я правильно помню, построен на основе многопроцессорной обработки и обеспечивает несколько более простой способ работы.

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

1 голос
/ 04 июля 2019

У вас не больше процессов, чем 8. У вас больше «рабочих элементов / заданий», чем 8. Используйте multiprocessing.queue для планирования вашей работы.Если процесс простаивает, получите что-то из этой очереди и обрабатывайте его до тех пор, пока очередь не будет завершена.Вам не нужно убивать процессы и создавать другой.

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