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.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM