Управление подпроцесса в Python


У меня есть скрипт анализа данных, который принимает аргумент, определяющий сегменты анализа для выполнения. Я хочу запустить до' n ' экземпляров скрипта в то время, когда 'n' - это количество ядер на машине. Сложность заключается в том, что сегментов анализа больше, чем ядер, поэтому я хочу запустить не более n процессов сразу, и один из них завершает, запускает другой. Кто-нибудь делал что-то подобное перед использованием модуля подпроцесса?

2 2

2 ответа:

Я действительно думаю, что многопроцессорная обработка модуль поможет вам достичь того, что вам нужно. Взгляните на пример техники.

import multiprocessing

def do_calculation(data):
    """
    @note: you can define your calculation code
    """
    return data * 2

def start_process():
    print 'Starting', multiprocessing.current_process().name

if __name__ == '__main__':
    analsys_jobs = list(range(10))  # could be your analysis work
    print 'analsys_jobs :', analsys_jobs

    pool_size = multiprocessing.cpu_count() * 2
    pool = multiprocessing.Pool(processes=pool_size,
                                initializer=start_process,
                                maxtasksperchild=2, ) 
    #maxtasksperchild = tells the pool to restart a worker process \
    # after it has finished a few tasks. This can be used to avoid \ 
    # having long-running workers consume ever more system resources

    pool_outputs = pool.map(do_calculation, analsys_jobs)   
    #The result of the map() method is functionally equivalent to the \
    # built-in map(), except that individual tasks run in parallel. \
    # Since the pool is processing its inputs in parallel, close() and join()\
    # can be used to synchronize the main process with the \
    # task processes to ensure proper cleanup.  

    pool.close() # no more tasks
    pool.join() # wrap up current tasks


    print 'Pool :', pool_outputs

Вы можете найти хорошие методы многопроцессорной обработки здесь , чтобы начать с

Используйте multiprocessing модуль , в частности класс Pool. Pool создает пул процессов (по умолчанию столько процессов, сколько у вас процессоров) и позволяет отправлять задания в пул, которые выполняются на следующем свободном процессе. Он берет на себя все управление подпроцессами и детали передачи данных между задачами, поэтому вы можете писать код очень простым способом. Смотрите документацию для некоторых примеров использования.