一个 CPU 核 开多少个 线程 比较合适 ?
这是一个 线程池 的 问题 。
我之前也 反对 过 线程池, 因为我认为 线程池 影响了 对 用户 的 实时响应性 。
我也认为, 分时 (对 CPU 资源的分配) 应该由 操作系统 来做就行, 不需要 再 画蛇添足 。
不过, 现在 主流的应用 好像都在用 线程池 , 比如 Asp.net ,对每个请求的处理, 好像是放到 线程池 里执行的, 所以 经常可以看到这样的现象, Asp.net 里 处理请求的 线程 的 线程号 是 重复的, 比如 处理 第一个请求 的 线程号 是 2, 处理 第三个请求 的 线程号 也是 2 , 处理 第 n 个请求, 第 x, y, z 个请求 的 线程号 也是 2 …… 。
所以, 考虑到 创建线程 的 性能花费 还是 挺可观 的, 算了, 还是 随大流 吧 。 我们也用 线程池 。
不过 “创建线程 的 性能花费 还是 挺可观 的” 这是 据说, 我没有具体去研究过 。
我之前写过一篇文章 《自己实现一个线程池》 https://www.cnblogs.com/KSongKing/p/9803935.html , 可以看看 。
接下里进入主题, 一个 CPU 核 开多少个 线程 比较合适 ?
如果我们写过 从网页上抓取内容 的 程序, 就会有一些经验 :
比如, 当 线程 开到 100 个 以上时, 效率 不升反降; 而 100 个线程 的 效率 和 60 个线程 一样, 60 个线程 和 40 个 也差不多 。
So ……
我的 CPU 是 2 核 4 线程, 所以这样评估下来的话, 1 个 核 开 10 ~ 20 个 线程 差不多 。
这个 核 没有算 超线程, 超线程 大概可以算 半个 核, 大家可以自己评估一下 。 哈哈哈
之前在 QQ 群 里讨论相关问题时, 有网友说, “线程切换 …… 一个 yield 下来, 就是 15 毫秒(ms) 。”
这个 yield 是什么意思, 我不知道, 你们去问他吧 …… 哈哈哈哈