[python] Python은 멀티 스레딩을 지원합니까? 실행 시간을 단축 할 수 있습니까?

다중 스레딩이 Python에서 작동하는지 여부에 대해 약간 혼란 스럽습니다.

나는 이것에 대해 많은 질문이 있었고 많은 것을 읽었지만 여전히 혼란 스럽습니다. 나는 내 경험을 통해 알고 있으며 다른 사람들이 여기에 StackOverflow에 자신의 답변과 예제를 게시하는 것을 보았습니다. 그렇다면 모든 사람들이 Python이 GIL에 의해 잠겨 있고 한 번에 하나의 스레드 만 실행할 수 있다고 계속 말하는 이유는 무엇입니까? 분명히 작동합니다. 아니면 내가 여기서 얻지 못하는 차이점이 있습니까?

많은 포스터 / 응답자들은 스레딩이 다중 코어를 사용하지 않기 때문에 제한적이라고 계속 언급합니다. 그러나 동시에 작업을 수행하므로 결합 된 워크로드가 더 빨리 완료되기 때문에 여전히 유용하다고 말할 수 있습니다. 왜 그렇지 않으면 파이썬 스레드 모듈이 있을까요?

최신 정보:

지금까지 모든 답변에 감사드립니다. 내가 이해하는 방식은 멀티 스레딩이 일부 IO 작업에 대해서만 병렬로 실행되지만 CPU 바운드 다중 코어 작업에 대해서는 한 번에 하나씩 만 실행할 수 있다는 것입니다.

이것이 실제적인 측면에서 나에게 어떤 의미인지 완전히 확신 할 수 없으므로 멀티 스레드를 수행하려는 작업의 종류에 대한 예를 들겠습니다. 예를 들어, 매우 긴 문자열 목록을 반복하고 각 목록 항목에 대해 몇 가지 기본 문자열 작업을 수행하고 싶다고 가정 해 보겠습니다. 목록을 분할하고 새 스레드의 루프 / 문자열 코드로 처리 할 각 하위 목록을 보내고 결과를 다시 대기열로 보내면 이러한 워크로드가 대략 동시에 실행됩니까? 가장 중요한 것은 이것이 이론적으로 스크립트를 실행하는 데 걸리는 시간을 단축한다는 것입니다.

또 다른 예는 4 개의 다른 스레드에서 PIL을 사용하여 4 개의 다른 그림을 렌더링하고 저장할 수 있고 그림을 하나씩 처리하는 것보다 더 빠를 수 있습니다. 이 속도 요소는 올바른 용어가 무엇인지 라기보다는 제가 정말로 궁금해하는 것 같습니다.

멀티 프로세싱 모듈에 대해서도 알고 있지만 지금은 중소 규모의 작업로드 (10-30 초)에 주된 관심이 있으므로 하위 프로세스를 시작하는 데 속도가 느릴 수 있으므로 멀티 스레딩이 더 적절할 것이라고 생각합니다.



답변

GIL은 스레딩을 방지하지 않습니다. GIL이하는 일은 한 번에 하나의 스레드 만 Python 코드를 실행하는지 확인하는 것입니다. 제어는 여전히 스레드간에 전환됩니다.

GIL이 방지하는 것은 하나 이상의 CPU 코어 또는 별도의 CPU를 사용하여 스레드를 병렬로 실행하는 것입니다.

이것은 Python 코드에만 적용됩니다. C 확장은 GIL을 릴리스하여 여러 C 코드 스레드와 하나의 Python 스레드가 여러 코어에서 실행되도록 할 수 있습니다. 이것은 select()소켓 읽기 및 쓰기에 대한 호출 과 같이 커널에 의해 제어되는 I / O로 확장 되어 Python이 다중 스레드 다중 코어 설정에서 네트워크 이벤트를 합리적으로 효율적으로 처리하도록합니다.

그런 다음 많은 서버 배포가 수행하는 작업은 둘 이상의 Python 프로세스를 실행하여 OS가 프로세스 간의 일정을 처리하여 CPU 코어를 최대로 활용하도록하는 것입니다. 사용 사례에 적합한 경우 multiprocessing라이브러리 를 사용하여 하나의 코드베이스 및 상위 프로세스에서 여러 프로세스에 걸쳐 병렬 처리를 처리 할 수도 있습니다 .

GIL은 CPython 구현에만 적용됩니다. Jython과 IronPython은 서로 다른 스레딩 구현을 사용합니다 (각각 네이티브 Java VM 및 .NET 공통 런타임 스레드).

업데이트를 직접 처리하려면 : 순수 Python 코드를 사용하여 병렬 실행에서 속도 향상을 시도하는 모든 작업은 스레드 된 Python 코드가 한 번에 실행되는 하나의 스레드에 잠겨 있으므로 속도가 향상되지 않습니다. 그러나 C 확장과 I / O를 혼합하면 (예 : PIL 또는 numpy 작업) 모든 C 코드가 하나의 활성 Python 스레드 와 병렬로 실행될 수 있습니다 .

Python 스레딩은 반응 형 GUI를 만들거나 I / O가 Python 코드보다 병목 현상이 더 큰 여러 개의 짧은 웹 요청을 처리하는 데 적합합니다. 계산 집약적 인 Python 코드를 병렬화 multiprocessing하거나 이러한 작업 을 위해 모듈을 고수 하거나 전용 외부 라이브러리에 위임하는 데 적합하지 않습니다 .


답변

예. 🙂

하위 수준 스레드 모듈과 상위 수준 스레드 모듈이 있습니다. 그러나 단순히 멀티 코어 머신을 사용하고 싶다면 멀티 프로세싱 모듈 을 사용 하면됩니다.

문서 에서 인용 :

CPython에서는 Global Interpreter Lock으로 인해 한 번에 하나의 스레드 만 Python 코드를 실행할 수 있습니다 (특정 성능 지향 라이브러리가이 제한을 극복 할 수 있음에도 불구하고). 애플리케이션이 멀티 코어 머신의 계산 리소스를 더 잘 활용하도록하려면 멀티 프로세싱을 사용하는 것이 좋습니다. 그러나 여러 I / O 바인딩 작업을 동시에 실행하려는 경우 스레딩은 여전히 ​​적절한 모델입니다.


답변

파이썬에서 스레딩이 허용됩니다. 유일한 문제는 GIL이 한 번에 하나의 스레드 만 실행되도록한다는 것입니다 (병렬 처리 없음).

따라서 기본적으로 계산 속도를 높이기 위해 코드를 다중 스레드하려는 경우 한 번에 하나의 스레드 만 실행되는 것처럼 속도가 빨라지지는 않지만 예를 들어 데이터베이스와 상호 작용하는 데 사용하면 속도가 빨라집니다.


답변