ホームページ  >  に質問  >  本文

java - 讨论一下Python线程池大小设置?

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

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

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

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

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

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

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


问题

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

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

大家讲道理大家讲道理2717日前609

全員に返信(1)返信します

  • 天蓬老师

    天蓬老师2017-04-18 10:20:10

    srv 用に設定する必要があるプロセスの数を見積もる方法は?
    原則
    各プロセスが占有するメモリの合計は、合計メモリよりも少ない必要があります

    • IO 集中型
      ネットワーク通信のオーバーヘッドをブロックするため、プロセス数が増加する可能性があります (たとえば、CPU コア数の 3 倍に構成されます)。ビジネスに多くのブロッキング ネットワーク オーバーヘッドが含まれる場合は、プロセス数を適切に増やすことができます (たとえば、CPU コア数の 5 倍以上)。

    • CPU 集中型
      つまり、外部ネットワーク IO オーバーヘッドやブロッキング ネットワーク IO オーバーヘッドがありません。たとえば、非同期 IO がネットワーク リソースの読み取りに使用され、プロセスがビジネス コードによってブロックされない場合、プロセスは CPU と同じに設定できます。コアの数は同じです。


    中心的な考え方は、応答のボトルネックが IO なのか CPU なのかということです。

    • 応答のボトルネックが CPU の場合

      リーリー
    • 応答のボトルネックが IO にある場合 (ネットワーク IO など)

      リーリー

    返事
    0
  • キャンセル返事