multiprocessing.Process를 사용하여 최대 동시 프로세스 수
나는이 Python
코드를 :
from multiprocessing import Process
def f(name):
print 'hello', name
if __name__ == '__main__':
for i in range(0, MAX_PROCESSES):
p = Process(target=f, args=(i,))
p.start()
잘 실행됩니다. 그러나 MAX_PROCESSES
변수 사이의 값이 될 수 1
와 512
. 8
코어가 있는 시스템에서만 이 코드 를 실행하기 때문에 동시에 실행할 수 있는 프로세스 수를 제한할 수 있는지 알아봐야 합니다. 을(를) 살펴보았지만 multiprocessing.Queue
필요한 것처럼 보이지 않거나 아마도 문서를 잘못 해석하고 있는 것 같습니다.
동시 multiprocessing.Process
실행 횟수를 제한하는 방법이 있습니까?
multiprocessing.Pool
시스템에서 사용 가능한 최대 코어 수를 기반으로 작업자 프로세스 풀을 생성한 다음 기본적으로 코어를 사용할 수 있게 되면 작업을 공급하는 것을 사용 하는 것이 가장 합리적 일 수 있습니다.
표준 문서( http://docs.python.org/2/library/multiprocessing.html#using-a-pool-of-workers ) 의 예 는 코어 수를 수동으로 설정할 수도 있음을 보여줍니다.
from multiprocessing import Pool
def f(x):
return x*x
if __name__ == '__main__':
pool = Pool(processes=4) # start 4 worker processes
result = pool.apply_async(f, [10]) # evaluate "f(10)" asynchronously
print result.get(timeout=1) # prints "100" unless your computer is *very* slow
print pool.map(f, range(10)) # prints "[0, 1, 4,..., 81]"
또한 multiprocessing.cpu_count()
코드에서 필요한 경우 주어진 시스템의 코어 수를 계산하는 방법 이 있다는 것을 아는 것도 편리 합니다.
편집: 다음은 특정 경우에 작동하는 것으로 보이는 초안 코드입니다.
import multiprocessing
def f(name):
print 'hello', name
if __name__ == '__main__':
pool = multiprocessing.Pool() #use all available cores, otherwise specify the number you want as an argument
for i in xrange(0, 512):
pool.apply_async(f, args=(i,))
pool.close()
pool.join()
더 일반적으로 다음과 같이 보일 수도 있습니다.
import multiprocessing
def chunks(l, n):
for i in range(0, len(l), n):
yield l[i:i + n]
numberOfThreads = 4
if __name__ == '__main__':
jobs = []
for i, param in enumerate(params):
p = multiprocessing.Process(target=f, args=(i,param))
jobs.append(p)
for i in chunks(jobs,numberOfThreads):
for j in i:
j.start()
for j in i:
j.join()
물론, 그 방법은 매우 잔인합니다(다음 청크가 계속될 때까지 정크의 모든 프로세스를 기다리기 때문입니다). 여전히 함수 호출의 거의 동일한 실행 시간에 대해 잘 작동합니다.
세마포어가 당신이 찾고 있는 샘플 코드라고 생각합니다.
from multiprocessing import Semaphore
def f(name, sema):
print 'hello', name
sema.release()
if __name__ == '__main__':
concurrency = 20
total_task_num = 1000
sema = Semaphore(concurrency)
all_processes = []
for i in range(total_task_num):
sema.acquire()
p = Process(target=f, args=(i, sema))
all_processes.append(p)
p.start()
# inside main process, wait for all processes to finish
for p in all_processes:
p.join()
Another way, which might make the code look more structured but will consume too much resources if total_task_num
is very large, is as follows:
from multiprocessing import Semaphore
def f(name, sema):
sema.acquire()
print 'hello', name
sema.release()
if __name__ == '__main__':
concurrency = 20
total_task_num = 1000
sema = Semaphore(concurrency)
all_processes = []
for i in range(total_task_num):
p = Process(target=f, args=(i, sema))
all_processes.append(p)
p.start()
# inside main process, wait for all processes to finish
for p in all_processes:
p.join()
ReferenceURL : https://stackoverflow.com/questions/20886565/using-multiprocessing-process-with-a-maximum-number-of-simultaneous-processes
'IT이야기' 카테고리의 다른 글
트위터 부트스트랩 드롭다운 메뉴의 z-색인 문제 (0) | 2021.10.02 |
---|---|
C++11에서 소멸자 뒤에 식별자 재정의 (0) | 2021.10.02 |
Stateless 위젯 클래스의 키 (0) | 2021.10.02 |
자바 서블릿 단위 테스트 (0) | 2021.10.02 |
SQL Server의 다른 저장 프로시저에서 호출된 저장 프로시저의 SELECT 출력을 억제하는 방법 (0) | 2021.10.01 |