About me
home
Portfolio
home

Thread, Process Pool

날짜
2023/07/19
태그
파이썬
이론

Pool 개념

Pool이란 어떤 자원 집합을 의미한다. 이 자원들은 보통 미리 생성되어, 필요한 곳에 배분되고 사용이 끝나면 다시 풀로 반환된다. 이러한 방식은 자원의 효율적인 사용을 가능하게 해주며, 필요할 때마다 자원을 생성하고 소멸시키는 것에 비해 성능을 향상시킬 수 있다.
1.
스레드 풀(Thread Pool)
스레드 풀은 한 번에 생성될 수 있는 스레드의 수를 제한하는 기술이다. 스레드 풀에는 일반적으로 일정 수의 스레드가 미리 생성되어 있고, 이들 스레드는 작업 큐에서 대기하고 있는 작업을 가져와 실행한다.
스레드 풀의 주요 장점은 스레드 생성과 제거에 따른 오버헤드를 줄일 수 있다는 것이다. 또한, 동시에 실행되는 스레드의 수를 제어함으로써 시스템 리소스를 보호할 수 있다.
2.
프로세스 풀(Process Pool)
프로세스 풀도 비슷한 원리로 작동한다. 프로세스 풀에는 일정 수의 프로세스가 미리 생성되어 있고, 이들 프로세스는 작업 큐에서 대기하고 있는 작업을 가져와 실행한다.
프로세스 풀을 사용하면, 프로세스 생성과 제거에 따른 오버헤드를 줄이고, 동시에 실행되는 프로세스의 수를 제어함으로써 시스템 리소스를 보호할 수 있다.
두 경우 모두, 풀의 크기는 시스템의 자원, 작업의 특성, 동시성의 수준 등에 따라 조정할 수 있다. 작업이 많아질 경우에는 풀의 크기를 늘려서 더 많은 작업을 동시에 처리할 수 있도록 할 수 있다. 반면, 리소스가 제한적인 경우에는 풀의 크기를 줄여서 리소스 사용량을 제한할 수 있다.

concurrent.futures 모듈

이 모듈은 스레드 또는 프로세스를 사용하여 함수를 병렬로 실행시킨다.
1.
Executor 객체: Executorconcurrent.futures의 핵심 클래스이다.
ThreadPoolExecutorProcessPoolExecutor의 기본 클래스로, 실행할 작업을 스케줄링하는 역할을 한다. Executor 객체로 submit 또는 map 을 이용해 함수를 실행시킨다.
2.
ThreadPoolExecutor 클래스: 이 클래스는 스레드 기반의 Executor이다.
I/O 바운드 작업에 대해 concurrent.futures.ThreadPoolExecutor를 사용하면 여러 스레드를 활용하여 작업을 병렬로 수행하고 성능을 향상시킬 수 있다.
3.
ProcessPoolExecutor 클래스: 이 클래스는 프로세스 기반의 Executor이다.
CPU 바운드 작업에 대해 concurrent.futures.ProcessPoolExecutor를 사용하면 여러 CPU 코어를 활용하여 작업을 병렬로 수행하고 성능을 향상시킬 수 있다.

submit 메서드

submit 메서드는 Executor 클래스의 메서드로, 주어진 함수를 비동기적으로 실행하고 concurrent.futures.Future 객체를 반환한다. Future 객체는 비동기 실행 작업의 상태를 추적하고, 작업이 완료되면 결과를 가져올 수 있는 방법을 제공한다.
submit 메서드 사용 예시
from concurrent.futures import ThreadPoolExecutor #ProcessPoolExecutor도 마찬가지 def task(n): return n * 2 with ThreadPoolExecutor(max_workers=3) as executor: future = executor.submit(task, 5) # 함수를 비동기적으로 실행하고, Future 객체를 반환받는다. print(future.result()) # Future 객체의 result 메서드를 사용해 작업 결과를 가져온다.
Python
복사

map 메서드

주어진 반복 가능한 객체의 각 요소에 대해 함수를 비동기적으로 실행하고, 결과를 반환하는 iterator를 반환한다. map 메서드는 Python의 내장 함수인 map과 유사한 역할을 하지만, 작업을 병렬로 처리한다는 차이점이 있다.
map 메서드 사용 예시
from concurrent.futures import ThreadPoolExecutor #ProcessPoolExecutor도 마찬가지 def task(n): return n * 2 with ThreadPoolExecutor(max_workers=3) as executor: results = executor.map(task, [1, 2, 3, 4, 5]) # 각 숫자에 대해 함수를 비동기적으로 실행하고, 결과 iterator를 반환받는다. for result in results: print(result) # 결과 iterator를 순회하며 각 작업의 결과를 출력한다.
Python
복사
submitmap 메서드는 비동기 작업을 스케줄링하고 결과를 추적하는 데 사용되며, 둘 다 작업을 병렬로 처리할 수 있게 해준다. submit은 하나의 작업을 스케줄링하고 Future 객체를 반환하며, map은 여러 작업을 스케줄링하고 결과를 순회할 수 있는 iterator를 반환한다.

with context 사용