IT이야기

multiprocessing.Process를 사용하여 최대 동시 프로세스 수

cyworld 2021. 10. 2. 17:52
반응형

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변수 사이의 값이 될 수 1512. 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

반응형