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

2015-12-24 16:28:02 +08:00
 sbmzhcn
最近用到线程池, 10 个线程处理队列,但现在有这样一个需求:
在某些时候我希望线程池中的线程只有 2 个在工作,因为此时过多的请求网络会导致失败。
在其它时间希望线程池中的线程数量有 10 个左右。

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

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

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

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

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

或者设置一个全局变量表示需要减少的线程数量,工作线程每次取队列前检查这个变量如果不为 0 就-1 并结束当前工作者线程。
SparkMan
2015-12-25 13:27:32 +08:00
1 、很傻但实用的方法:创建 2 个线程池,闲得时候任务提交到 10 个线程的池子中;忙得时候提交到 2 个线程的池子中。
bug0day
2015-12-25 13:52:11 +08:00
不要试图调整线程, ratelimit 就 ok 了啊
quietin
2015-12-29 14:51:00 +08:00
调整线程成本太高,因为会有内核态用户态切换,不是数量特别多没有必要管理
sbmzhcn
2015-12-30 20:34:45 +08:00
我最后用线程池解决的。

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

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

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

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

© 2021 V2EX