python concurrent.futures.Threadpoolexcutor的有界队列和无界队列

1、默认是无界队列,如果生产任务的速度大大超过消费的速度,则会把生产任务无限添加到无界队列中,这样一来控制不了生产速度,二来是会造成系统内存会被队列中的元素堆积增多而耗尽。

2、改写为有界队列

 

class BoundedThreadPoolExecutor(ThreadPoolExecutor):
    def __init__(self, max_workers=None, thread_name_prefix=''):
        super().__init__(max_workers,thread_name_prefix)
        self._work_queue = queue.Queue(max_workers * 2)

 

这个很容易测试验证,消费函数里面来加个time.sleep,如果使用ThreadPoolExecutor会一股脑生成任务添加到任务队列中,由于线程池同时处理不了那么多的任务,任务队列内存增大。

如果使用BoundedThreadPoolExecutor,当任务队列中的任务是线程池最大线程数量的2倍后,则会被block住,不再继续生成任务,直到任务队列可以被put一个元素

 

 

具体的测试方法可以用下面来测试

复制代码
def fun(i__):
    time.sleep(2)
    print(str(i__) + 'hi')



# pool = BoundedThreadPoolExecutor(5)
pool = ThreadPoolExecutor(5)
for i in range(100):
    print(i)
    pool.submit(fun,i)
复制代码

如果使用ThreadPoolExecutor,会迅速打印0到99.然后慢慢打印 0hi 1hi 2hi   。。。。。。。。

如果使用BoundedThreadPoolExecutor则会交替打印,不会一下子就迅速打印完0到99.

posted @   北风之神0509  阅读(2129)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示