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
sbmzhcn
V2EX  ›  Python

根据队列的大小,如何自动调整线程池中线程的数量?

  •  
  •   sbmzhcn · 2015-12-24 16:28:02 +08:00 · 3867 次点击
    这是一个创建于 3284 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近用到线程池, 10 个线程处理队列,但现在有这样一个需求:
    在某些时候我希望线程池中的线程只有 2 个在工作,因为此时过多的请求网络会导致失败。
    在其它时间希望线程池中的线程数量有 10 个左右。

    请问如何在程序运行的时候调节线程数量?

    我查了下网上的方案都是开始就固定好线程池中的线程数量了。
    6 条回复    2015-12-30 20:34:45 +08:00
    scenix
        1
    scenix  
       2015-12-24 17:41:03 +08:00
    其实你的需求不是动态调整线程数量,而是动态调整在干活的线程数量。

    一个简单的解决方案,来个全局变量 N 。你想要几个线程,就设置 N 是几。

    给每个线程一个 id ,运行的时候读 N 的值,如果 id>=N, 就 sleep 。

    感觉妥妥的
    gamexg
        2
    gamexg  
       2015-12-24 17:46:59 +08:00
    加个 Semaphore ,工作者每次取队列前调用 acquire ,需要减少线程时另开一个线程多次调用 acquire 即可。

    或者设置一个全局变量表示需要减少的线程数量,工作线程每次取队列前检查这个变量如果不为 0 就-1 并结束当前工作者线程。
    SparkMan
        3
    SparkMan  
       2015-12-25 13:27:32 +08:00
    1 、很傻但实用的方法:创建 2 个线程池,闲得时候任务提交到 10 个线程的池子中;忙得时候提交到 2 个线程的池子中。
    bug0day
        4
    bug0day  
       2015-12-25 13:52:11 +08:00
    不要试图调整线程, ratelimit 就 ok 了啊
    quietin
        5
    quietin  
       2015-12-29 14:51:00 +08:00
    调整线程成本太高,因为会有内核态用户态切换,不是数量特别多没有必要管理
    sbmzhcn
        6
    sbmzhcn  
    OP
       2015-12-30 20:34:45 +08:00
    我最后用线程池解决的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1096 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 18:55 · PVG 02:55 · LAX 10:55 · JFK 13:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.