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