Python 线程池数量问题, - V2EX
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
wuwukai007

Python 线程池数量问题,

  •  
  •   wuwukai007 Nov 12, 2019 5134 views
    This topic created in 2373 days ago, the information mentioned may be changed or developed.
    任务内都是 IO 密集型,每个任务耗时 5 到 6 秒,跑 20000 次,
    那么如何合理设置线程池的数量呢?有没有经验之谈或者公式。
    机器 >4 核 12 线程
    12 replies    2019-11-12 13:44:59 +08:00
    unixeno
        1
    unixeno  
       Nov 12, 2019 via Android
    io 密集型看你 io 啊
    而且 Python 有 gil,你多线程也只能利用一个核心
    wuwukai007
        2
    wuwukai007  
    OP
       Nov 12, 2019
    @unixeno 任务内都是 查数据库,所以可以理解为走网络,开线程可以提高效率的
    wuwukai007
        3
    wuwukai007  
    OP
       Nov 12, 2019
    我之前线程池开了 60+ ,后面发现数据库的连接数过多,后面改成 30 个,感觉效率反而也不差
    Philippa
        4
    Philippa  
       Nov 12, 2019
    线程是可以共享内存的,建一个线程池分享给所有的线程使用,线程池数量当然最大值要大于线程数,配置自动回收线程,配置超时时间。其次,最终要多少线程还取决于你的数据库啦,因此单纯从这里信息是看不出最佳数量的。

    一般我都会实际测试一下,写个脚本,因为线程池改个数字就能看出来了。计算平均反应时间和中位数,哪里开始到达顶峰等等方式就可以直到大概最高点在哪里。如果性能还需要优化,这时就可以看看哪里是瓶颈,再进一步优化。线程数量可能不是需要优化的东西。举个例子,我之前用 64 个线程来请求 serverless 服务,因为 serverless 自动扩充,因此速度基本是 32 线程翻一翻的,因此我也可以知道线程池还没因为线程过多导致出问题的。
    holajamc
        5
    holajamc  
       Nov 12, 2019
    试试用异步?
    Leigg
        6
    Leigg  
       Nov 12, 2019 via Android
    很明显你的数据库连接数牵制了最大线程数,如果忽略前者影响,windows 上开几百个线程都是 ok 的。
    wuwukai007
        8
    wuwukai007  
    OP
       Nov 12, 2019
    @Philippa 谢谢,我用的 oracle 数据库,最多只能支持 1000 连接 , 如果我线程池数量开的过多,会导致数据库连接过多,因为生产上还有别的项目再跑,我之前是直接开了多进程再加上线程池组合的方式,数据库连接也是用的连接池,但是还是会导致数据库连接过多,后面我发现线程池减小一点,效率也没降低,看来这是跟数据库有关了,我测试下
    wuwukai007
        9
    wuwukai007  
    OP
       Nov 12, 2019
    @Leigg 谢谢,估计数据库问题
    wangyzj
        10
    wangyzj  
       Nov 12, 2019
    @wuwukai007 IO 密集型还是从 IO 上找把
    其他的影响不那么大
    查 oracle 不如看看索引
    wysnylc
        11
    wysnylc  
       Nov 12, 2019
    io 密集型把线程数设置为虚拟核心数量,fork/join 框架就是这么做的
    676529483
        12
    676529483  
       Nov 12, 2019
    io 密集型一个进程内,开 2*CPU 核数就差不多了。如果还觉得不够,就开多进程。
    再说你数据库要用连接池,去复用同一个连接啊
    About     Help     Advertise     Blog     API     FAQ     Solana     2788 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 49ms UTC 15:40 PVG 23:40 LAX 08:40 JFK 11:40
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86