중화사전망 - 서예자전 - Python 에서 다중 프로세스 대신 다중 프로세스를 권장하는 이유는 무엇입니까?

Python 에서 다중 프로세스 대신 다중 프로세스를 권장하는 이유는 무엇입니까?

최근 우리는 파이썬의 멀티 스레딩을 보고 있을 때 한 베테랑이 "파이썬 속 멀티 스레딩은 닭갈비야, 멀티 프로세스 추천!" 이라고 말하는 것을 자주 들었다. 그런데 왜 그렇게 말하죠?

우리는 왜 그런지, 그리고 왜 그런지 알아야 한다. 그래서 다음과 같은 심층 연구가 있습니다.

먼저 배경을 강조하십시오.

1, GIL 은 무엇입니까?

GIL 의 전체 이름은 글로벌 인터프리터 잠금 (Global Interpreter Lock) 으로, python 설계 초기 고려사항과 데이터 보안을 위한 결정에서 비롯됩니다.

2. CPU 당 한 번에 하나의 스레드만 실행할 수 있습니다 (실제로 싱글 코어 CPU 아래의 멀티 스레드는 병렬 처리가 아닌 동시성에 불과합니다. 동시성과 병렬성은 여러 요청을 동시에 처리하는 거시적 개념이다. 그러나 동시성과 병행은 차이가 있다. 평행은 둘 이상의 이벤트가 동시에 발생한다는 것을 의미합니다. 동시성은 둘 이상의 이벤트가 같은 시간 간격 내에 발생한다는 것을 의미합니다. ) 을 참조하십시오

파이썬 멀티 스레딩에서 각 스레드의 실행 모드는 다음과 같습니다.

1, GIL 얻기

2. 수면 또는 파이썬 가상 머신이 일시 중지될 때까지 코드를 실행합니다.

3. GIL 해제

스레드가 실행되려면 먼저 GIL 을 받아야 합니다. 우리는 GIL 을' 통행증' 으로 볼 수 있지만 파이썬 프로세스에는 GIL 이 하나밖에 없습니다. 통과 할 수없는 스레드는 CPU 실행에 들어갈 수 없습니다.

Python2.x 에서 GIL 의 해제 논리는 현재 스레드가 IO 작업을 만나거나 ticks 수가100 에 도달하는 것입니다 (Ticks 는 Python 자체의 카운터로 볼 수 있으며, GIL 전용, 각 해제 후 0 이 될 수 있습니다. 이 수는 Sys.setch 를 통해 가능합니다.

그러나 GIL 잠금이 해제될 때마다 스레드는 잠금을 놓고 스레드를 전환하므로 리소스가 소모됩니다. 또한 python 의 프로세스는 GIL 잠금의 존재로 인해 동시에 하나의 스레드만 실행할 수 있습니다 (GIL 을 얻는 스레드는 실행만 가능). 이는 python 멀티 스레드 효율성이 멀티코어 CPU 에서 높지 않은 이유입니다.

그럼 파이썬의 멀티 스레딩은 완전히 쓸모가 없나요?

여기서 우리는 분류에 대해 논의합니다.

1, CPU 집약형 코드 (다양한 루프 처리, 개수 등). ), 이 경우 많은 계산 작업으로 인해 틱톡 틱톡 수가 곧 임계값에 도달한 다음 GIL 의 석방과 재경쟁 (물론 멀티 스레드 간 전환은 자원이 필요함) 을 트리거하기 때문에 python 에는 많은 것들이 있습니다.