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.