как разветвлять несколько процессов из нескольких процессов - PullRequest
4 голосов
/ 17 октября 2019

У меня есть задача, которая должна выполнить несколько подзадач, каждая из которых имеет свой собственный vm, а затем, когда все подзадачи завершены, объединить результаты и представить их обратно вызывающей стороне.

Я реализовалпри этом используется multiprocessing.Pool, и он отлично работает.

Теперь я хочу увеличить масштаб, выполняя несколько из этих задач параллельно.

Первоначально я планировал заключить мою задачу в другую. multiprocessing.Pool, где каждая задача выполняется в своем процессе, эффективно разворачиваясь следующим образом:

job
+----- task_a
|      +------ subtask_a1
|      +------ subtask_a2
|      +------ subtask_a3
+----- task_b
       +------ subtask_b1
       +------ subtask_b2
       +------ subtask_b3
  • job запускает multiprocessing.Pool с 2 процессами, один для task_a и один дляtask_b.
  • в свою очередь, task_a и task_b каждый запускает multiprocessing.Pool с 3 процессами, по одному для каждой из их подзадач.

Когда я пыталсяЗапустив мой код, я столкнулся с ошибкой утверждения:

AssertionError: daemonic processes are not allowed to have children

При поиске информации в Интернете я нашел следующую ветку , отрывок которой гласит:

Что касается разрешения дочерним потокам порождать своих собственных дочерних процессов с помощью подпроцесса, запускаетсяриск создания небольшой армии «внуков-зомби», если родительский или дочерний потоки завершатся до завершения подпроцесса и вернутся

Я также нашел обходных путей , которые разрешают этот вид"pool in the pool" используется:

class NoDaemonProcess(multiprocessing.Process):
    @property
    def daemon(self):
        return False

    @daemon.setter
    def daemon(self, value):
        pass

class NoDaemonContext(type(multiprocessing.get_context())):
    Process = NoDaemonProcess

class MyPool(multiprocessing.pool.Pool):
    def __init__(self, *args, **kwargs):
        kwargs['context'] = NoDaemonContext()
        super(MyPool, self).__init__(*args, **kwargs)

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

Так что я думаю, мой вопросis:

  • Какой питонный способ «разветвлять» несколько процессов внутри нескольких процессов??
...