Python ThreadPoolExecutor 默认无界队列

2022-09-27  本文已影响0人  sexy_cyber

线程池其实有两个模块,一个是队列就是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

上一篇 下一篇

猜你喜欢

热点阅读