django 使用全局線程池

需求背景

系統(tǒng)里面有頻繁的異步操作,每次觸發(fā)異步操作就會開始一個新的線程處理相關(guān)邏輯,邏輯集中在I/O密集型;頻繁的新建/銷毀線程,消耗大量資源;由此,考慮使用線程池替換現(xiàn)有邏輯。

實現(xiàn)邏輯

經(jīng)過查詢資料,python有ThreadPoolExecutor(tomorrow)可以直接實現(xiàn)線程池的相關(guān)功能,它的使用方式

executor = ThreadPoolExecutor(max_workers=2)

具體使用方法見ThreadPoolExecutor
ThreadPoolExecutor建立的線程池會先啟動若干數(shù)量的線程,并讓這些線程都處于睡眠狀態(tài),當(dāng)向線程池submit一個任務(wù)后,會喚醒線程池中的某一個睡眠線程,讓它來處理這個任務(wù),當(dāng)處理完這個任務(wù),線程又處于睡眠狀態(tài)。減少了建立銷毀線程池消耗
在本項目里面的實現(xiàn)如下(定義的裝飾器)

from concurrent.futures.thread import ThreadPoolExecutor
class ThreadPool(object):
    def __init__(self):
        # 線程池
        self.executor = ThreadPoolExecutor(100)

global_thread_pool = ThreadPool()
def async_func(f):
    def wrapper(*args, **kwargs):
        global_thread_pool.executor.submit(f, *args, **kwargs)
    return wrapper

如何設(shè)置max_workers

總體的原則是: CPU密集型任務(wù)應(yīng)配置盡可能小的線程,盡量跟CPU的個數(shù)相近;IO密集型任務(wù)應(yīng)配置盡可能多的線程,因為IO操作不占用CPU,不要讓CPU閑下來,應(yīng)加大線程數(shù)量。推薦的公式:

最佳線程數(shù)目 = (線程等待時間與線程CPU時間之比 + 1)* CPU數(shù)目

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 個人記錄,麻煩指正! 線程池的前世今生 ??答:Java1.5中引入的Executor框架把任務(wù)的提交和執(zhí)行進(jìn)行解...
    沈先生的影子閱讀 506評論 0 1
  • 1 線程池簡介 1.1 為什么使用線程池 降低系統(tǒng)資源消耗,通過重用已存在的線程,降低線程創(chuàng)建和銷毀造成的消耗; ...
    上善若淚閱讀 1,656評論 0 1
  • [TOC] 什么是線程池 在 Java 中,如果每個請求到達(dá)就創(chuàng)建一個新線程,創(chuàng)建和銷毀線程花費的時間和消耗的系統(tǒng)...
    悠娜的奶爸閱讀 225評論 0 1
  • 使用線程池的原因 無線創(chuàng)建線程的不足在生產(chǎn)環(huán)境中,為每一個任務(wù)都分配一個線程這種方法存在一些缺陷:線程生命周期的開...
    德彪閱讀 764評論 0 1
  • 一. 簡介 在實際開發(fā)中,我們有時會需要多線程并發(fā)執(zhí)行一些任務(wù),如果并發(fā)的線程數(shù)量很多,并且每個線程都是執(zhí)行一個時...
    wind_sky閱讀 1,234評論 0 0

友情鏈接更多精彩內(nèi)容