2017-10-25 2 views
0

많은 HTTP 요청을 동시에 보내려고합니다. 이 작업을 수행하기 위해 파이썬의 multiprocessing.dummy.Pool을 사용하고 있습니다. 다음은 스레드 풀HTTP 요청 당 하나의 작업자 스레드를 사용해야합니까?

p = Pool(len(users)) 

len(users))를 생성하는 코드는 요청의 수는 단순히이다.

자세히 알 수 있듯이 각 요청마다 스레드가 생성됩니다. 이것은 나쁜 생각입니까? 대신 len(users)) 개의 스레드를 만들어야합니까?

+0

현재 접근 방식에 문제가 있습니까? – wwii

+0

복제본이 조용하지 않으면 * 스레드 수/프로세스/연결 수 *를 선택하는 근거가 보이지 않지만 마음에들 수도 있습니다. https://stackoverflow.com/q/2632520/2823755 – wwii

답변

1

나는 개인적으로 multiprocessing.cpu_count()의 배수로 크기 조정을 제안합니다. 이것은 의 접근 방법이며, 스레드 작업 블록이 많아서 코어보다 많은 스레드가 필요하다는 이론에 5 * multiprocessing.cpu_count()을 사용합니다. 거대한 인터넷 파이프가있는 경우, 더 높은 배수가 의미가있을 수 있습니다. 원하는 경우 min(len(users), 5 * multiprocess.cpu_count())으로 제한 할 수 있습니다 (포화 작업이 없을 때 너무 많은 스레드를 할당하지 않아도 됨).

많은 시스템에서 상당히 낮은 값에서 발생할 수있는 스레드와 열린 핸들에 한계가 있기 때문에 작업 당 스레드를 사용하고 싶지는 않습니다. 모든 것을 한꺼번에 처리하려고하면, 10,000 개 이상의 요청에 대해 이야기합니다. 인터넷 연결이 특정 시점을 넘어서 병렬 처리의 이점을 얻을 수 없다는 것을 감안할 때 더 많은 스레드가있는 리소스를 낭비하는 것입니다.

+0

실제로 스레드와 다른 접근법. 파이썬에는 asyncio라는 것이있다. 나는 이것이 리눅스의 select 함수와 같다고 생각한다. 아이디어는 비 차단 요청을 보낸 다음 그 중 하나가 완료 될 때까지 기다리는 것입니다. – JRG

+0

@JRG : 일종의. 파이썬에는 직접 인터페이스 인'선택 '(그리고 현대 파이썬에서'선택자') 모듈이 있지만, 비동기 기능은 비슷한 것들을 할 수 있습니다 (많은 것들을 사용하면 전체 프로그램 디자인을 납치하는 경향이 있습니다). – ShadowRanger

관련 문제