Python에서 멀티스레딩 대신 멀티프로세싱을 사용하는 것이 권장됩니까? 멀티 프로세스 사용을 권장하는 이유 공유

零下一度
풀어 주다: 2017-06-01 10:03:58
원래의
1584명이 탐색했습니다.

최근에 Python의 멀티스레딩에 대해 읽었는데, 베테랑들이 다음과 같이 말하는 것을 자주 듣습니다. “Python의 멀티스레딩은 쓸모가 없습니다. 멀티프로세스를 권장합니다!”, 그런데 왜 그런가요? 그렇게 말해요?​ ~ 그래서 다음과 같은 심층적인 연구가 있습니다. 1. GIL이란 무엇입니까?

GIL의 정식 이름은 Global Interpreter Lock(글로벌 인터프리터 잠금)입니다. 출처는 Python 설계 초기의 고려 사항과 데이터 보안을 위한 결정입니다.

2. 각 CPU는 동시에 하나의 스레드만 실행할 수 있습니다
(단일 코어 CPU 아래의 여러 스레드는 실제로 병렬성이 아니라 동시성입니다. 동시성과 병렬성은 모두 동시에 처리됩니다. 거시적인 관점 다중 채널 요청의 개념. 그러나 동시성과 병렬성에는 차이가 있습니다. 병렬성은 두 개 이상의 이벤트가 동시에 발생한다는 것을 의미하고 동시성은 두 개 이상의 이벤트가 동일한 시간 간격으로 발생한다는 것을 의미합니다.

. Python 멀티스레딩에서 각 스레드의 실행 방법은 다음과 같습니다. 1. GIL을 얻습니다2. 절전 모드 또는 Python 가상 머신이 일시 중지될 때까지 코드를 실행합니다. 3. GIL 해제 프로세스에는 GIL이 하나만 있습니다. 패스를 얻을 수 없는 스레드는 실행을 위해 CPU에 들어갈 수 없습니다. Python2에서는 GIL에 사용되며 각 릴리스 후에 0으로 재설정되고 sys.setcheckinterval을 통해 조정될 수 있습니다.​ GIL 잠금이 해제될 때마다 스레드는 잠금을 놓고 경쟁하고 스레드를 전환하여 리소스를 소비합니다. 그리고 GIL 잠금으로 인해 Python의 프로세스는 동시에 하나의 스레드만 실행할 수 있습니다(GIL을 획득한 스레드는 실행할 수 있음). 이것이 Python의 멀티 스레딩 효율성이 멀티 코어 CPU에서 높지 않은 이유입니다. ~
                                                         여기서는 분류 토론을 진행합니다.
1, CPU 밀집 코드(다양한 주기 처리, 계산 등) 이 경우 대규모 계산 작업으로 인해 곧 Ticks 개수가 임계값이 됩니다. 도달하면 GIL의 릴리스 및 재경쟁이 시작됩니다(여러 스레드 간에 앞뒤로 전환하는 것은 확실히 리소스를 소비합니다). 따라서 Python의 멀티스레딩은 CPU 집약적인 코드에 적합하지 않습니다.
2. IO 집약적인 코드(파일 처리
, 웹 크롤러 등), 멀티 스레딩은 효율성을 효과적으로 향상시킬 수 있습니다(단일 스레드에서 IO 작업이 있는 경우). , IO 대기가 발생하여 불필요한 시간 낭비가 발생하지만, 멀티스레딩을 켜면 스레드 A가 대기하는 동안 자동으로 스레드 B로 전환되므로 CPU 리소스가 낭비되지 않아 프로그램 실행 효율성이 향상됩니다. 그래서 Python의 멀티스레딩은 IO 집약적인 코드에 더 친숙합니다. Python3에서는 프로그램이 더 친숙해졌지만 동시에 하나의 스레드만 실행할 수 있는 GIL 문제를 여전히 해결하지 못하여 효율성이 여전히 만족스럽지 않습니다. ㅋㅋ                                                                                     ​IL은 GIL 잠금을 깨우는 스레드로 얻을 수 있으므로 원활하게 실행될 수 있지만 멀티 코어에서는 CPU0이 GIL을 릴리스한 후 다른 CPU의 스레드가 경쟁하지만 GIL CPU0에 의해 즉시 획득될 수 있으며, 이로 인해 다른 여러 CPU의 스레드가 깨어나고 전환 시간까지 기다린 다음 대기 상태로 전환되어 스레드 스래싱이 발생하여 효율성이 저하됩니다.          시작 질문 : 자주 우리는 베테랑들이 다음과 같이 말하는 것을 듣습니다: "파이썬에서 멀티 코어 CPU를 최대한 활용하려면 멀티 프로세스를 사용하세요" , 그 이유는 무엇입니까?​


이유는 각 프로세스마다 독립적인 GIL이 있고 서로 간섭하지 않기 때문에 진정한 의미에서 병렬로 실행될 수 있기 때문입니다. 멀티 스레딩의 경우 여러 프로세스의 실행 효율성이 뛰어납니다(멀티 코어 CPU에만 해당).

결론은 다음과 같습니다. 멀티 코어에서 병렬 처리를 수행하여 효율성을 높이려면 실행 효율성을 효과적으로 향상시킬 수 있는 멀티 프로세스를 사용하는 것이 더 일반적인 방법입니다

【관련 권장 사항】

1. Python의 다중 프로세스 및 다중 스레드 예제(1)

2. Python의 다중 프로세스 및 다중 스레드 예제(2) 프로그래밍 방법

3. Python에서 멀티 프로세싱 또는 멀티 스레딩이 더 빠릅니까?

4.

Python 프로세스, 스레드 및 코루틴에 대한 자세한 소개

5.

Python 동시 프로그래밍 스레드 풀/프로세스 풀

위 내용은 Python에서 멀티스레딩 대신 멀티프로세싱을 사용하는 것이 권장됩니까? 멀티 프로세스 사용을 권장하는 이유 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿