하나의 요청마다 하나의 스레드 생성되어 요청을 처리한다. 1:1 맵핑
요청마다 스레드를 생성하고 폐기하게 되면 스레드의 생성에 시간을 소비하기 때문에 요청 처리가 더 오래 걸린다.
처리 속도 < 요청 속도
스레드마다 메모리를 점유하기 때문에 메모리 여유 공간이 사라진다.
Queue에 request들이 들어오게 되면 스레드 풀에 형성되어 있는 스레드를 1:1 맵핑하여 요청을 처리하고, 사용한 스레드는 스레드 풀에 반납(release)하게 된다.
-> 스레드 생성시간을 감소 시킬 수 있으며, 스레드가 무제한으로 생성되는 것을 방지한다.
CPU bound 프로세스의 경우 CPU 코어보다 1~2개 많이
I/O bound 프로세스의 경우 CPU 코어보다 1.5~3배 성능테스트를 해보며 찾는다.
스레드 풀에 존재하는 스레드들이 모든 요청을 다 처리중일 경우 더이상 처리할 수 있는 스레드가 존재하지 않기 때문에 스레드 풀의 요청을 저장하는 Queue의 크기를 확인하고 제한해야한다. Queue에 제한이 없는경우 request들이 무한히 쌓인다.
자바의 Executors 클래스의 생성자에는 LinkedBlockingQueue를 사용하여 객체를 생성하는데 LinkedBlockingQueue 생성자에 Integer.MAX_VALUE를 Queue 사이즈로 사용한다. 따라서 Queue의 사이즈가 매우 크다.
이렇게 되면 스레드 풀에 존재하는 스레드가 요청이 들어오는 속도보다 처리속도가 느리게 되면 계속해서 스레드는 고갈되고 대기 큐에는 요청이 무한으로 쌓이게 된다.
파이썬 ThreadPoolExecutor