subprocess.Popen()을 사용하여 명령 줄에서 실행되는 프로그램에서 회귀 테스트를 실행하기 위해 python 스크립트 (cygwin 및 Linux 환경 용)를 작성하고 있습니다. 기본적으로, 나는 일련의 작업을 가지고 있는데, 그 중 일부는 개발자의 필요에 따라 실행될 필요가있다 (10-1000 정도). 각 작업은 완료하는 데 몇 초에서 20 분 정도 소요될 수 있습니다.Python의 다중 처리 풀에서 작업을 동적으로 재정렬
여러 작업에서 성공적으로 작업을 수행하지만 이전 작업을 지능적으로 정렬하여 긴 작업을 먼저 실행하여 시간을 절약하려고합니다. 합병증은 일부 작업 (정상 상태 계산)이 다른 작업보다 먼저 실행되어야한다는 것입니다 (정상 상태로 결정된 초기 조건을 기반으로 한 과도 현상).
이 처리 방법은 상위 작업과 모든 하위 작업을 동일한 프로세스에서 반복적으로 실행하는 것이지만 일부 작업에는 여러 개의 장기 실행 하위가 있습니다. 상위 작업이 완료되면 하위 프로세스를 풀에 다시 추가하려고하지만 대기열의 헤드에 추가해야합니다. 나는 다중 처리로 이것을 할 수 있을지 확신하지 못한다. 바보. Manager와 함께 예를 살펴 보았지만 모두 네트워킹에 기반을두고 있으며 특히 적용 할 수 없습니다. 코드 형태의 도움이나 멀티 프로세싱에 대한 좋은 자습서 링크 (내가 봤으니 ...)는 많이 감사하겠습니다. 지금까지 내가 가지고있는 것에 대한 코드의 해골이 있는데, 다른 프로세서에서 생성하고자하는 자식 작업을 지적했다.
import multiprocessing
import subprocess
class Job(object):
def __init__(self, popenArgs, runTime, children)
self.popenArgs = popenArgs #list to be fed to popen
self.runTime = runTime #Approximate runTime for the job
self.children = children #Jobs that require this job to run first
def runJob(job):
subprocess.Popen(job.popenArgs).wait()
####################################################
#I want to remove this, and instead kick these back to the pool
for j in job.children:
runJob(j)
####################################################
def main(jobs):
# This jobs argument contains only jobs which are ready to be run
# ie no children, only parent-less jobs
jobs.sort(key=lambda job: job.runTime, reverse=True)
multiprocessing.Pool(4).map(runJob, jobs)
무작위 참고 사항 : 여기서는 다중 처리를 사용하지 않는 것이 좋습니다. 스레드를 사용하거나 프로세스를 시작하고 대기하는 전통적인 방법 ('subprocess' 모듈 및'os.wait()')으로 동일한 결과를 얻을 수 있습니다. –