>  기사  >  백엔드 개발  >  Python의 MultiProcessing 라이브러리에 대한 심층 설명

Python의 MultiProcessing 라이브러리에 대한 심층 설명

巴扎黑
巴扎黑원래의
2017-07-18 14:02:402563검색

MultiProcessing 모듈은 동시성을 처리하는 패키지와 유사한 우수한 멀티스레드 MultiThreading 모듈입니다.
이 라이브러리에 대해 조금 전에 접했지만 이번에는 심심해서 공부하지 않았습니다. 내 의심을 해결하십시오.
오늘은 apply_async와 map 메소드에 대해 공부해보겠습니다. 이 두 가지 방법으로 프로세스 풀의 프로세스를 관련 기능에 할당한다는 소문이 있습니다.
이 두 가지에 대한 공식 웹사이트의 설명을 보세요:
apply_async(func[, args[, kwds[, callback[, error_callback]]]])
결과 객체를 반환하는 apply() 메서드의 변형입니다.

If 콜백이 지정되면 단일 인수를 허용하는 콜백이어야 합니다. 결과가 준비되면 콜백이 적용됩니다. 즉, 호출이 실패하지 않는 한 error_callback이 대신 적용됩니다.

error_callback이 지정되면 단일 인수를 허용하는 콜러블이어야 합니다. 대상 함수가 실패하면 예외 인스턴스와 함께 error_callback이 호출됩니다.

콜백은 즉시 완료되어야 합니다. 그렇지 않으면 결과를 처리하는 스레드가 차단됩니다.


map(func , iterable[,chunksize])
map() 내장 함수와 동일한 병렬 함수입니다(그러나 반복 가능한 인수는 하나만 지원합니다). 결과가 준비될 때까지 차단됩니다.

이 방법은 반복 가능 항목을 여러 개의 청크로 나눕니다. 이는 별도의 작업으로 프로세스 풀에 제출됩니다. 이러한 청크의 (대략적인) 크기는 청크 크기를 양의 정수로 설정하여 지정할 수 있습니다.

풀은 새 요청이 제출될 때 사용자가 호출할 수 있는 지정된 수의 프로세스를 제공할 수 있습니다. 풀이 아직 가득 차지 않은 경우 요청을 실행하기 위해 새 프로세스가 생성되지만 풀의 프로세스 수가 지정된 최대값에 도달하면 요청은 풀의 프로세스가 끝날 때까지 대기합니다. 새로운 프로세스를 실행해 보세요

프로그램을 살펴보겠습니다:

from multiprocessing import Poolimport timeimport osdef func(msg):print('msg: %s %s' % (msg, os.getpid()))
    time.sleep(3)print("end")if __name__ == '__main__':
    pool = Pool(4)for i in range(4):
        msg = 'hello %d' % (i)
        pool.apply_async(func, (msg, ))# pool.map(func, range(4))print("Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~")
    pool.close()
    pool.join()   # 调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束print("Sub-process(es) done.")

실행 결과:

맵 주석을 제거하고 apply_async 함수에 주석을 추가하세요

프로세스를 살펴보세요 풀 프로세스가 충분하지 않을 때 프로그램 및 실행 결과:

from multiprocessing import Poolimport timeimport osdef func(msg):print('msg: %s %s' % (msg, os.getpid()))
    time.sleep(3)print("end")if __name__ == '__main__':
    pool = Pool(3)'''for i in range(4):
        msg = 'hello %d' % (i)
        pool.apply_async(func, (msg, ))'''pool.map(func, range(4))print("Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~")
    pool.close()
    pool.join()   # 调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束print("Sub-process(es) done.")

프로그램 결과:

보시다시피 프로세스 풀의 프로세스 개수가 풀 프로세스 개수보다 크거나 같으면 함수를 실행해야 하면 원활하게 진행될 것이고, 결과를 보는 것은 당연하지만 프로세스 풀의 프로세스 수가 실행될 함수 수보다 적으면 하나의 프로세스가 차단됩니다. 즉, 두 개 이상의 함수가 하나의 프로세스를 공유합니다.
게다가 apply_async 함수는 두 번째 매개변수 값으로 전달됩니다. 이 함수가 실행되면 프로세스가 함수에 할당되므로 주의하세요. 여러 프로세스를 할당해야 하는 경우 for 루프 또는 while 루프가 필요합니다. map 함수는 두 번째 매개변수 값으로 반복자를 받으므로 for 루프를 사용할 필요가 없습니다. 이 두 함수가 구현하는 것은 프로세스 풀의 프로세스를 함수에 차례로 할당하는 것임을 기억하세요.

그나저나 MultiProcessing의 공식 홈페이지는 모두 영어로 되어 있어서 읽기가 매우 헷갈리고 힘들기도 하지만, 영어에 매우 도움이 된다고 말씀드리고 싶습니다...

위 내용은 Python의 MultiProcessing 라이브러리에 대한 심층 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:삼항 연산자 소개다음 기사:삼항 연산자 소개