Управляйте количеством вложенных параллельных процессов в Python - PullRequest
0 голосов
/ 08 ноября 2018

Прежде всего, я использую 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)

...