Управление подпроцесса в Python
У меня есть скрипт анализа данных, который принимает аргумент, определяющий сегменты анализа для выполнения. Я хочу запустить до' n ' экземпляров скрипта в то время, когда 'n' - это количество ядер на машине. Сложность заключается в том, что сегментов анализа больше, чем ядер, поэтому я хочу запустить не более n процессов сразу, и один из них завершает, запускает другой. Кто-нибудь делал что-то подобное перед использованием модуля подпроцесса?
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
создает пул процессов (по умолчанию столько процессов, сколько у вас процессоров) и позволяет отправлять задания в пул, которые выполняются на следующем свободном процессе. Он берет на себя все управление подпроцессами и детали передачи данных между задачами, поэтому вы можете писать код очень простым способом. Смотрите документацию для некоторых примеров использования.