Прежде всего, я использую Python 2.7, я знаю, что есть лучшие способы сделать это с Python 3.3, но, учитывая определенные ограничения, это не вариант.
Я использую модуль multiprocessing
для распараллеливания задачи, связанной с файловым вводом / выводом. Задачи должны выполняться в течение нескольких дней, станций и сеансов. Есть задачи в день, и каждый день имеет одну задачу на станцию, и каждая станция имеет ряд задач в зависимости от сеансов. Итак, я составил схему вложенных параллельных процессов:
# Main program, calls task per day
# Do stuff
arguments = [(date, config) for date in dateInterval]
pool = MyPool(processes=1) # MyPool instead of Pool to allow nested multiprocessing
manager = mp.Manager()
lock = manager.Lock()
func = partial(parallelPPP, lock)
pool.map(func, arguments)
pool.close()
pool.join()
# Task per day, calls task per station
def parallelPPP(lock, (date, config)):
# Do stuff
arguments = [(station.lower(), config) for station in config["stations"]]
pool = MyPool()
func = partial(station_job, lock)
pool.map(func, arguments)
pool.close()
pool.join()
# Task per day, calls task per station
def station_job(lock, (station, config)):
# Do stuff
arguments = [(offset, config) for offset in missingOffsets]
pool = mp.Pool()
func = partial(offset_job, lock)
pool.map(func, arguments)
pool.close()
pool.join()
# Task per session, final
def offset_job(lock, (offset, config)):
# Do stuff
При настройке pool = MyPool(processes=1)
я просто контролирую количество активных parallelPPP
заданий. То, что я хотел бы контролировать - это конечное количество заданий, количество offset_job
вызовов. Есть ли родной способ контролировать это? Или я должен изменить модуль сам? Чтобы создать эту вложенную схему, я должен был сначала изменить ее, как в https://stackoverflow.com/a/8963618/7139191 (отсюда и взято MyPool
)