Как сохранить n процессов запущенными в списке заданий разной длины в Python 2.7? - PullRequest
0 голосов
/ 24 февраля 2019

Итак, немного предыстории о том, что я пытаюсь сделать: Ниже я написал некоторый код, который будет создавать задания по 4 и запускать их.Эти задания содержат много данных, поэтому я хочу ограничить количество запущенных одновременно.В зависимости от содержания данных эти задания могут варьироваться во времени выполнения от 2 до 15 минут.Ниже я написал код для запуска этих заданий в пакетах по 4. Это много работает.

Текущее выполнение кода

Требуемое выполнение кода

Опять же, эти задания сильно различаются по продолжительности выполнения.Таким образом, создается впечатление, что выполнение заданий в пакетах по 4 (или n) может привести к потере времени.Например, если задано 4 задания, если 3 занимают 2 минуты, а другое - 10, то будет 8 минут только одного запущенного процесса.

Итак, мой вопрос: есть ли способ предоставить список заданий для некоторой функции / класса / чего угодно, чтобы я мог поддерживать постоянным число процессов и заданий?

        manager = multiprocessing.Manager()
        return_dict = manager.dict()

        jobs = []

        numOFProc = 4

        for api in WellAPIs: #iterate over individual wells in a file

            p = multiprocessing.Process(target=self.processWell, args=(df,CreatingPrediction,cache,df, newColList, clustringPredictionColName,return_dict,lock))
            jobs.append(p)

            p.start()

            numOfActiveProc = len(jobs)

            if numOFProc <= numOfActiveProc:
                for proc in jobs:
                    proc.join()
                jobs = []
            print "jobs: " + str(jobs)


        for proc in jobs:
            proc.join()
        jobs = []

        for parDF in return_dict.values():
            outDf = outDf.append(parDF)

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

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

0 голосов
/ 25 февраля 2019

Вы, вероятно, ищете Pool

from multiprocessing import Pool

def f(x):
    return x*x

if __name__ == '__main__':
    p = Pool(5)   # NUMBER OF PROCESSES
    print(p.map(f, [1, 2, 3]))   # APPLIES `f` TO EACH ELEMENT
    # APPEND THIS TO MY TODO LIST AND PRINT IT WHEN IT'S DONE
    p.apply_async(f, (10,), callback=print)
    print(p.apply_async(f, (10,)).get())

Вы можете сделать Pool(4), а затем использовать map с любой итерацией, когда итерация используется,функция останавливается.Кроме того, вы можете использовать apply async, который использует либо обратный вызов, либо .get()

...