Имеется:
- огромный массив данных (который читается итеративно)
- желание обрабатывать каждое данное в отдельном подпроцессе
- обработка одного данного может ркурсивно породить новые задачи (не огромное количество), и их тоже хочется распараллелить
Очевидно, что нужна какая-то комбинация multiprocessing.Pool и multiprocessing.Queue.
Для Pool можно использовать map-функции с параметром chunksize соответствующему количеству подпроцессов, тогда у итератора будет запрашиваться количество задач примерно соответствующих количеству свободных обработчиков:
pool = Pool(num_workers)
for r in pool.map(data_handler, data_input_iter, num_workers): pass
Но непонятно, как тут порождать задачи рекурсивно.
Для Queue можно установить её размер по количеству подпроцессов, тогда заполнение будет блокироваться примерно пока очередной обработчик не освободится.
queue = Queue(num_workers)
for datum in data_input_iter:
queue.put(datum, block=True)
Но это будет блокировать заполние очереди из подпроцесса обработчика.