Python 线程池数量问题,

2019-11-12 10:46:53 +08:00
 wuwukai007
任务内都是 IO 密集型,每个任务耗时 5 到 6 秒,跑 20000 次,
那么如何合理设置线程池的数量呢?有没有经验之谈或者公式。
机器 >4 核 12 线程
4664 次点击
所在节点    Python
12 条回复
unixeno
2019-11-12 10:49:06 +08:00
io 密集型看你 io 啊
而且 Python 有 gil,你多线程也只能利用一个核心
wuwukai007
2019-11-12 10:50:29 +08:00
@unixeno 任务内都是 查数据库,所以可以理解为走网络,开线程可以提高效率的
wuwukai007
2019-11-12 10:52:33 +08:00
我之前线程池开了 60+ ,后面发现数据库的连接数过多,后面改成 30 个,感觉效率反而也不差
Philippa
2019-11-12 10:59:54 +08:00
线程是可以共享内存的,建一个线程池分享给所有的线程使用,线程池数量当然最大值要大于线程数,配置自动回收线程,配置超时时间。其次,最终要多少线程还取决于你的数据库啦,因此单纯从这里信息是看不出最佳数量的。

一般我都会实际测试一下,写个脚本,因为线程池改个数字就能看出来了。计算平均反应时间和中位数,哪里开始到达顶峰等等方式就可以直到大概最高点在哪里。如果性能还需要优化,这时就可以看看哪里是瓶颈,再进一步优化。线程数量可能不是需要优化的东西。举个例子,我之前用 64 个线程来请求 serverless 服务,因为 serverless 自动扩充,因此速度基本是 32 线程翻一翻的,因此我也可以知道线程池还没因为线程过多导致出问题的。
holajamc
2019-11-12 11:02:47 +08:00
试试用异步?
Leigg
2019-11-12 11:09:10 +08:00
很明显你的数据库连接数牵制了最大线程数,如果忽略前者影响,windows 上开几百个线程都是 ok 的。
ClericPy
2019-11-12 11:09:13 +08:00
wuwukai007
2019-11-12 11:16:20 +08:00
@Philippa 谢谢,我用的 oracle 数据库,最多只能支持 1000 连接 , 如果我线程池数量开的过多,会导致数据库连接过多,因为生产上还有别的项目再跑,我之前是直接开了多进程再加上线程池组合的方式,数据库连接也是用的连接池,但是还是会导致数据库连接过多,后面我发现线程池减小一点,效率也没降低,看来这是跟数据库有关了,我测试下
wuwukai007
2019-11-12 11:29:14 +08:00
@Leigg 谢谢,估计数据库问题
wangyzj
2019-11-12 11:43:47 +08:00
@wuwukai007 IO 密集型还是从 IO 上找把
其他的影响不那么大
查 oracle 不如看看索引
wysnylc
2019-11-12 12:29:56 +08:00
io 密集型把线程数设置为虚拟核心数量,fork/join 框架就是这么做的
676529483
2019-11-12 13:44:59 +08:00
io 密集型一个进程内,开 2*CPU 核数就差不多了。如果还觉得不够,就开多进程。
再说你数据库要用连接池,去复用同一个连接啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/618720

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX