참고 : 내가 언급하는 곳 thread
은 명시 적으로 언급하기 전까지 는 특별히 파이썬 스레드를 의미합니다 .
스레드는 C/C++
백그라운드 에서 온 경우 Python에서 약간 다르게 작동합니다 . 파이썬에서는 주어진 시간에 하나의 스레드 만 실행 상태 일 수 있습니다. 즉, 파이썬의 스레드는 설계 상 여러 코어에서 병렬로 스레드를 실행할 수 없기 때문에 여러 처리 코어의 성능을 진정으로 활용할 수 없습니다.
파이썬 메모리 관리 스레드 세이프되지 않기 때문에 각각의 스레드 파이썬 interpreter.This의 데이터 구조에 대한 단독 액세스 배타적 액세스라고 불리는기구에 의해 취득 요구 (글로벌 interpretr 고정) .GIL
Why does python use GIL?
여러 스레드가 인터프리터 상태에 동시에 액세스하여 인터프리터 상태를 손상시키는 것을 방지하기 위해.
아이디어는 스레드가 실행될 때마다 (메인 스레드 인 경우에도) GIL을 획득하고 미리 정의 된 시간 간격 후에 GIL을 현재 스레드에서 해제하고 다른 스레드 (있는 경우)에 의해 다시 획득하는 것입니다.
Why not simply remove GIL?
GIL을 제거하는 것이 불가능한 것은 아닙니다. 그렇게하는 대신에 액세스를 직렬화하기 위해 인터프리터 내부에 여러 개의 잠금을 두게되어 단일 스레드 응용 프로그램의 성능이 저하됩니다.
따라서 GIL을 제거하는 비용은 결코 바람직하지 않은 단일 스레드 응용 프로그램의 성능 저하로 보상됩니다.
So when does thread switching occurs in python?
스레드 전환은 GIL이 해제 될 때 발생하는데, GIL은 언제 해제됩니까? 고려해야 할 두 가지 시나리오가 있습니다.
Thread가 CPU Bound 작업을 수행하는 경우 (Ex 이미지 처리).
이전 버전의 python에서 스레드 전환은 고정 된 Python 명령어 수 이후에 발생 100
했지만 기본적으로으로 설정되어 있습니다 . 밀리 초에서 1 초까지 매우 100
거칠 수 있으므로 실행하는 데 걸리는 시간에 관계없이 모든 명령 후에 GIL을 릴리스 하는 것은 좋지 않은 정책입니다.
새 버전에서는 명령어 개수를 측정 항목으로 사용하여 thread를 전환하는 대신 구성 가능한 시간 간격이 사용됩니다. 기본 전환 간격은 5 밀리 초이며을 사용하여 현재 전환 간격을 얻을 수 있습니다 sys.getswitchinterval()
. 이것은 다음을 사용하여 변경할 수 있습니다.sys.setswitchinterval()
스레드가 일부 IO 바인딩 작업을 수행하는 경우 (Ex 파일 시스템 액세스 또는
네트워크 IO)
GIL은 스레드가 IO 작업이 완료 될 때까지 대기 할 때마다 해제됩니다.
Which thread to switch to next?
인터프리터에는 자체 스케줄러가 없습니다. 간격이 끝날 때 스케줄되는 스레드는 운영 체제의 결정입니다. .