- python 的线程池,内部默认用的是无界队列,而且不支持传参,感觉这个设计还是蛮蠢的。
- 我一直以来都以为是有界队列,并且队列长度就是线程池限制的(max_works)的长度
- 关于有界队列无界对的事情,这个得了解下线程池大概的工作原理
线程池其实有两个模块,一个是队列就是python内置的queue,用来接受任务,并且不限制队列长度,并且不是阻塞的,无线不阻塞的塞;
另外一个模块是有控制的创建子线程,你定义了几个子线程就创建几个,子线程再从这个队列拿任务去工作
解决方案
可以重现线程池类的init方法,将无界队列,改为有界队列
import queue
from concurrent.futures import ThreadPoolExecutor
class ThreadPoolExecutor(ThreadPoolExecutor):
"""
重写线程池修改队列数
"""
def __init__(self, max_workers=None, thread_name_prefix=''):
super().__init__(max_workers, thread_name_prefix)
# 队列大小为最大线程数的1倍
self._work_queue = queue.Queue(self._max_workers * 1)
关于定义的队列的长度,大部分文章都是用两倍的关系;但是!一旦线程池挂掉,多丢掉一倍的任务,这个风险很大,感觉没有必要*2
网友评论