Skip to content

Python:concurrent.futures

ThreadPoolExecutor

ThreadPoolExecutor는 내부적 으로 작업자 스레드를 사용합니다.

INFORMATION

이는 주로 GIL(Global Interpreter Lock)이 프로세스 내 스레드의 병렬 실행을 방지하기 때문에 CPU 바인딩 작업 대신 IO 바인딩 작업에 적합합니다

ThreadPoolExecutor는 시스템 수준 구성인 작업자 스레드를 사용합니다. 운영 체제는 CPU 코어에서 특정 시간에 실행할 스레드를 선택합니다.

ThreadPoolExecutor vs asyncio

ThreadPoolExecutor는 멀티 태스킹을 통해 동시성을 달성하는 반면, AsyncIO는 협력적 멀티태스킹을 통해 동시성을 달성합니다.

ThreadPoolExecutor를 사용하는 경우

  • 코루틴이 아닌 스레드를 사용합니다.
  • 소프트웨어 수준이 아닌 시스템 수준.
  • 협동이 아닌 선제적 멀티태스킹.
  • 작업은 제한되지 않는 모든 기능입니다.
  • 스레드 안전성이 필요합니다.
  • 1000개가 아닌 100개의 스레드를 생성하세요.

ThreadPoolExecutor 가 적합한 몇 가지 일반적인 사례를 살펴보겠습니다. 다음과 같은 경우에 ThreadPoolExecutor를 사용하십시오:

  • 상태나 부작용이 없는 순수 함수로 작업을 정의할 수 있습니다.
  • 귀하의 작업은 단일 Python 함수 내에 적합하므로 간단하고 이해하기 쉽습니다.
  • 동일한 작업(예: 동종 작업)을 여러 번 수행해야 합니다.
  • for 루프의 컬렉션에 있는 각 개체에 동일한 함수를 적용해야 합니다.

ThreadPoolExecutor 의 가장 좋은 점은 상대적으로 독립적인 IO 바인딩 작업이 있는 Python 프로그램을 동시에 변환하는 것입니다.

스레드 풀을 사용하여 프로그램을 구축할 수 있지만 순차 코드로 프로그램을 구상, 구현 및 테스트한 다음 ThreadPoolExecutor를 사용하여 동시 실행하여 프로그램 성능을 향상시키는 것이 더 가능성이 높습니다.

AsyncIO를 사용해야 하는 경우

  • 스레드가 아닌 코루틴을 사용합니다.
  • 시스템 수준이 아닌 소프트웨어 수준.
  • 선점형이 아닌 협력적 멀티태스킹.
  • 어떤 기능도 아닌 대기 가능한 작업입니다.
  • 스레드 안전 문제가 없습니다.
  • 합리적으로 제한되지 않은 100,000개 이상의 코루틴을 생성합니다.

AsyncIO가 적합한 몇 가지 일반적인 사례를 살펴보겠습니다. 다음과 같은 경우에 AsyncIO를 사용하세요:

  • 비동기 프로그래밍 패러다임을 명시적으로 채택하고 싶거나 채택해야 합니다.
  • 1000개 이상의 동시 IO 바인딩 작업을 실행해야 합니다.

AsyncIO는 Python 스레드의 대안으로 제안되었지만 이는 오해의 소지가 있습니다.

처음부터 비동기 프로그래밍 패러다임을 수용해야 하며 나중에 ThreadPoolExecutor 처럼 추가할 수 없습니다. 이런 방식으로 프로그램을 설계하는 동안 미리 고려해야 한다는 점에서 Thread 클래스를 확장하는 것과 비슷할 수 있습니다. AsyncIO의 가장 좋은 점은 ThreadPoolExecutor와 같이 많은 IO 바인딩 작업을 수행하는 프로그램입니다. ThreadPoolExecutor와 달리 IO 바인딩 작업에는 asyncio 모듈이나 타사 라이브러리와 같은 비차단 API도 있어야 합니다. 비동기 프로그래밍과 asyncio 모듈을 완전히 수용하면 더 많은 기능을 갖춘 코드를 생성할 수 있다는 이점이 있습니다.

예를 들어, 코루틴을 사용하면 스레드 풀을 사용할 때처럼 각 작업에 대해 시스템 스레드를 인스턴스화하기 위해 운영 체제에서 기다릴 필요 없이 수만 또는 수십만 개의 IO 바인딩 작업을 쉽게 전달할 수 있습니다. 이로 인해 일반적으로 비동기 프로그래밍이 가능해지며 asyncio 모듈은 다음과 같이 방대한 수의 IO 바인딩 작업이 필요한 프로그램에 특히 적합합니다.

  • 여러 서버에 연결되어 있는 클라이언트 프로그램입니다.
  • 많은 클라이언트의 연결을 지원하는 서버 프로그램입니다.
  • 많은 피어와의 연결을 지원하는 P2P 프로그램입니다.

See also

References


  1. ThreadPoolExecutor_vs_AsyncIO_in_Python.pdf