任务内都是 IO 密集型,每个任务耗时 5 到 6 秒,跑 20000 次,
那么如何合理设置线程池的数量呢?有没有经验之谈或者公式。
机器 >4 核 12 线程
那么如何合理设置线程池的数量呢?有没有经验之谈或者公式。
机器 >4 核 12 线程

1 unixeno Nov 12, 2019 via Android io 密集型看你 io 啊 而且 Python 有 gil,你多线程也只能利用一个核心 |
2 wuwukai007 OP @unixeno 任务内都是 查数据库,所以可以理解为走网络,开线程可以提高效率的 |
3 wuwukai007 OP 我之前线程池开了 60+ ,后面发现数据库的连接数过多,后面改成 30 个,感觉效率反而也不差 |
4 Philippa Nov 12, 2019 线程是可以共享内存的,建一个线程池分享给所有的线程使用,线程池数量当然最大值要大于线程数,配置自动回收线程,配置超时时间。其次,最终要多少线程还取决于你的数据库啦,因此单纯从这里信息是看不出最佳数量的。 一般我都会实际测试一下,写个脚本,因为线程池改个数字就能看出来了。计算平均反应时间和中位数,哪里开始到达顶峰等等方式就可以直到大概最高点在哪里。如果性能还需要优化,这时就可以看看哪里是瓶颈,再进一步优化。线程数量可能不是需要优化的东西。举个例子,我之前用 64 个线程来请求 serverless 服务,因为 serverless 自动扩充,因此速度基本是 32 线程翻一翻的,因此我也可以知道线程池还没因为线程过多导致出问题的。 |
5 holajamc Nov 12, 2019 试试用异步? |
6 Leigg Nov 12, 2019 via Android 很明显你的数据库连接数牵制了最大线程数,如果忽略前者影响,windows 上开几百个线程都是 ok 的。 |
7 ClericPy Nov 12, 2019 |
8 wuwukai007 OP @Philippa 谢谢,我用的 oracle 数据库,最多只能支持 1000 连接 , 如果我线程池数量开的过多,会导致数据库连接过多,因为生产上还有别的项目再跑,我之前是直接开了多进程再加上线程池组合的方式,数据库连接也是用的连接池,但是还是会导致数据库连接过多,后面我发现线程池减小一点,效率也没降低,看来这是跟数据库有关了,我测试下 |
9 wuwukai007 OP @Leigg 谢谢,估计数据库问题 |
10 wangyzj Nov 12, 2019 |
11 wysnylc Nov 12, 2019 io 密集型把线程数设置为虚拟核心数量,fork/join 框架就是这么做的 |
12 676529483 Nov 12, 2019 io 密集型一个进程内,开 2*CPU 核数就差不多了。如果还觉得不够,就开多进程。 再说你数据库要用连接池,去复用同一个连接啊 |