V2EX = way to explore
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
V2EX  ›  Python

Python 线程池数量问题,

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

    一般我都会实际测试一下,写个脚本,因为线程池改个数字就能看出来了。计算平均反应时间和中位数,哪里开始到达顶峰等等方式就可以直到大概最高点在哪里。如果性能还需要优化,这时就可以看看哪里是瓶颈,再进一步优化。线程数量可能不是需要优化的东西。举个例子,我之前用 64 个线程来请求 serverless 服务,因为 serverless 自动扩充,因此速度基本是 32 线程翻一翻的,因此我也可以知道线程池还没因为线程过多导致出问题的。
    holajamc
        5
    holajamc  
       2019-11-12 11:02:47 +08:00
    试试用异步?
    Leigg
        6
    Leigg  
       2019-11-12 11:09:10 +08:00 via Android
    很明显你的数据库连接数牵制了最大线程数,如果忽略前者影响,windows 上开几百个线程都是 ok 的。
    wuwukai007
        8
    wuwukai007  
    OP
       2019-11-12 11:16:20 +08:00
    @Philippa 谢谢,我用的 oracle 数据库,最多只能支持 1000 连接 , 如果我线程池数量开的过多,会导致数据库连接过多,因为生产上还有别的项目再跑,我之前是直接开了多进程再加上线程池组合的方式,数据库连接也是用的连接池,但是还是会导致数据库连接过多,后面我发现线程池减小一点,效率也没降低,看来这是跟数据库有关了,我测试下
    wuwukai007
        9
    wuwukai007  
    OP
       2019-11-12 11:29:14 +08:00
    @Leigg 谢谢,估计数据库问题
    wangyzj
        10
    wangyzj  
       2019-11-12 11:43:47 +08:00
    @wuwukai007 IO 密集型还是从 IO 上找把
    其他的影响不那么大
    查 oracle 不如看看索引
    wysnylc
        11
    wysnylc  
       2019-11-12 12:29:56 +08:00
    io 密集型把线程数设置为虚拟核心数量,fork/join 框架就是这么做的
    676529483
        12
    676529483  
       2019-11-12 13:44:59 +08:00
    io 密集型一个进程内,开 2*CPU 核数就差不多了。如果还觉得不够,就开多进程。
    再说你数据库要用连接池,去复用同一个连接啊
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5285 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 01:18 · PVG 09:18 · LAX 17:18 · JFK 20:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.