У меня есть задача, которая должна выполнить несколько подзадач, каждая из которых имеет свой собственный 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:
- Какой питонный способ «разветвлять» несколько процессов внутри нескольких процессов??