2012-11-10 4 views
1

나는 100 개의 작업을 실행할 수 있습니다. 병렬로 실행할 수는 있지만 각각의 작업은 많은 메모리를 차지합니다. 그래서 저는 동시에 8 명만 출마 할 수 있습니다.총 N 개의 작업을 실행합니다. 언제든지 M 개가 병렬로 실행됩니다.

나는 현재이 쉘 스크립트가 있습니다

(
(python run.py $arg1 &) 
(python run.py $arg2 &) 
(python run.py $arg3 &) 
(python run.py $arg4 &) 
(python run.py $arg5 &) 
(python run.py $arg6 &) 
(python run.py $arg7 &) 
(python run.py $arg8 &) 
) 2>&1 | cat -u 

(
(python run.py $arg9 &) 
(python run.py $arg10 &) 
(python run.py $arg11 &) 
(python run.py $arg12 &) 
(python run.py $arg13 &) 
(python run.py $arg14 &) 
(python run.py $arg15 &) 
(python run.py $arg16 &) 
) 2>&1 | cat -u 

... 

이 여덟의 첫 번째 배치를 실행하는 효과를 가지고 있으며, 그들은 모두 완료되면, 그것은 문제가 있다는 것입니다 (8)의 다음 배치를 시작을 실행 시간은 각 작업에 대해 일정하지 않으며 일부는 다른 것보다 먼저 완료되기 때문에 완료 될 8의 각 배치에 대해 가중치를 적용하는 것이 좋지 않습니다. 8 중에서 가장 느린 작업을 효과적으로 기다리고 있습니다.

대신 모든 100 개의 작업을 실행하는 스크립트 (셸 또는 파이썬)를 갖고 싶습니다. 최적의 효율성을 위해 주어진 시간에 8 개를 병렬로 실행합니다.

달성에 대한 아이디어가 있습니까?

+0

'cat -u'는 어떻게해야하나요? [맨 페이지] (http://unixhelp.ed.ac.uk/CGI/man-cgi?cat)에 따르면 -u는 무시됩니다. –

+1

@ NickODell TBH이 스크립트를 어딘가에서 복사 했으므로 확실하지 않습니다. 내 남자는 뭔가 다른 것을 보았습니다. "-u 출력 버퍼링을 비활성화합니다." – Greystache

답변

4

자신 만의 작은 스케줄러를 작성하여 현재 할당 된 프로세서에 할당 할 수 있습니다. 하지만 센터 we strongly recommend에서 gnu parallel을 사용하고 있습니다. 이미 xargs와 유사한 구문으로 구현했습니다. 당신이 파일에 인수 목록이 있다면

그래서 예를 들어, 위와 같이, 당신은 당신이

cat args.list | parallel --max-procs 8 python run.py 
+0

고마워요. 좋은 해결책 같아요! – Greystache

3

필요에 따라 다양한 도구를 사용할 수 있습니다. 가장 간단한 방법은 아마도 GNU parallel을 사용하는 것입니다. make-j 스위치와 병렬로 작업을 실행할 수 있습니다. 실행하려는 작업이 더 복잡하고 다양 할 경우 실제 대기열 처리 시스템이 도움이 될 수 있습니다. Dr. Queue. 더 많은 도구가 있습니다. GNU parallel's man page은 그 목록을 멋지게 나열합니다.

2

같은 것을 할 수있는,

parallel --max-procs 8 <<EOF 
    python run.py $arg1 
    python run.py $arg2 
    python run.py $arg3 
    .. 
EOF 

을하거나 수 그것은 나에게 보인다 multiprocessing 모듈을 찾고 있습니다 (구체적으로 multiprocessing.Pool).

만약 내가 이것을하고 있었다면 run.py에 모든 다른 인수 집합을 주었을 것이고 main(args) 함수의 run.py에서 현재 최상위에서 수행하는 작업을 랩 한 다음 Pool의 map 메소드를 사용하여 호출 할 수 있습니다 그 방법은 모든 다른 인수 집합에 걸쳐서 사용됩니다.

그것은 다음과 같이 보일 수 있습니다 이것은 하나 개의 문자열 (및 sys.argv의 따라서 하나 개의 항목)에서 개최 할 수있는 각 실행에 대한 인수를 가정합니다

import multiprocessing 

def main(args): 
    # Here's where you would do what you usually do with the arguments 

pool = multiprocessing.Pool(processes=8) 
pool.map(main, sys.argv[1:], chunksize=1) 
pool.close() 
pool.join() 

참고.

관련 문제