實際案例:
我們實現了一個web視頻監控服務器,服務器端采集攝像頭數據,客戶端使用浏覽器通過http請求接收數據。服務器使用推送的方式(multipart/x-mixed-replace)一直使用一個tcp連接向客戶端傳遞數據。這種方式將持續占用一個線程,導致單線程服務器無法處理多客戶端請求。
改寫程序,在每個線程中處理一個客戶端請求,支持多客戶端訪問。
解決方案:
threading.local函數可以創建線程本地數據空間,其下屬性對每個線程獨立存在,多個線程之間都是不干擾的。
線程本地數據的簡單使用
import threading
# 創建線程的本地數據
l = threading.local()
# 對l任意添加一個屬性它都是線程的本地數據,
# x就是主線程的本地數據,其它線程訪問不到l下的x
l.x = 1
def f():
print(l.x)
# 在本線程調用x
f()
# 在子線程中運行f()
# threading.Thread(target=f).start()
# 可以看到拋出一個異常找不到x屬性,所有在子線程中使用l也是訪問不到x的。
# AttributeError: '_thread._local' object has no attribute 'x'
# 修改f(),讓他對進行l.x修改
def f2():
l.x = 5
# 啟動子線程運行f2
threading.Thread(target=f2).start()
# 在主線程中再訪問l.x,可以看到還是沒有改變還是1,說明每個線程x它是獨立的
print(l.x)