java - 讨论一下Python线程池大小设置?
大家讲道理
大家讲道理 2017-04-18 10:18:10
0
1
650

在Java中,线程池大小通常被设置成CPU核心数+1,《Java Concurrency In Practise》8.2节中有这么一段话:

对于计算密集型的任务,在拥有N个处理器的系统上,当线程池的大小为N+1时,通常能实现最优的效率。(即使当计算密集型的线程偶尔由于缺失故障或者其他原因而暂停时,这个额外的线程也能确保CPU的时钟周期不会被浪费。)

btw: 不太熟悉Java,网上引用,没经过实践。

并发编程网上也有一篇相关的文章,要点如下:

  • 如果是CPU密集型应用,则线程池大小设置为N+1

  • 如果是IO密集型应用,则线程池大小设置为2N+1

最佳线程数目 = ((线程等待时间+线程CPU时间)/线程CPU时间 )* CPU数目

线程等待时间所占比例越高,需要越多线程。线程CPU时间所占比例越高,需要越少线程。

疑问:对于n核和2n线程的处理器有什么需要注意的地方?


问题

以上都是引用自Java,Python方面的资料相对较少,所以想讨论一下。

由于CPython中GIL存在,Python同一时刻只能运行一个线程,所以这里不讨论计算型任务,只看IO型任务,Python线程池大小应该怎么设置才算合理?(IO最好的办法是采用异步,主要想讨论下不支持异步的情形)

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

모든 응답(1)
Peter_Zhu

srv에 설정해야 하는 프로세스 수를 어떻게 추정하나요?
원칙
각 프로세스가 차지하는 메모리의 합은 전체 메모리보다 작아야 합니다

  • IO 집약적
    일부 차단 네트워크 통신 오버헤드가 포함되어 프로세스 수를 늘릴 수 있습니다(예: CPU 코어 수의 3배로 구성). 비즈니스에 차단 네트워크 오버헤드가 많이 포함되는 경우 프로세스 수를 적절하게 늘릴 수 있습니다(예: CPU 코어 수의 5배 이상).

  • CPU 집약적
    즉, 외부 네트워크 IO 오버헤드가 없거나 차단 네트워크 IO 오버헤드가 없습니다. 예를 들어 비동기 IO를 사용하여 네트워크 리소스를 읽고 프로세스가 비즈니스에 의해 차단되지 않는 경우입니다. 코드를 작성하면 프로세스 수는 CPU 코어 수와 동일하게 설정됩니다.


중심 아이디어는 응답의 병목 현상이 io인지 CPU인지입니다.

  • 응답 병목 현상이 CPU인 경우

    으아아아
  • 응답 병목 현상이 IO에 있는 경우(예: 네트워크 IO)

    으아아아
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿