需求背景
系統(tǒng)里面有頻繁的異步操作衰腌,每次觸發(fā)異步操作就會開始一個新的線程處理相關(guān)邏輯贸伐,邏輯集中在I/O密集型勘天;頻繁的新建/銷毀線程,消耗大量資源捉邢;由此脯丝,考慮使用線程池替換現(xiàn)有邏輯。
實(shí)現(xiàn)邏輯
經(jīng)過查詢資料伏伐,python有ThreadPoolExecutor(tomorrow)可以直接實(shí)現(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àng)目里面的實(shí)現(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)配置盡可能多的線程整吆,因?yàn)镮O操作不占用CPU,不要讓CPU閑下來辉川,應(yīng)加大線程數(shù)量掂为。推薦的公式:
最佳線程數(shù)目 = (線程等待時(shí)間與線程CPU時(shí)間之比 + 1)* CPU數(shù)目