標籤:執行函數 pytho 不能 script start 自己的 就是 bsp 源碼
1. 本地線程,保證即使是多個線程,自己的值也是互相隔離。2.普通對象示範
import threadingimport timeclass A(): passa=A()def func(num): a.name=num time.sleep(1) print(a.name,threading.current_thread().name)
結果
D:\virtualenv\envs\vuedjango\Scripts\python.exe D:/test/flaskTest/flaskpro3/本地線程.py4 線程14 線程04 線程34 線程24 線程4Process finished with exit code 0
因為需要sleep最後a.name所得到的值都是最後一個了,無法保證每個線程所對應的值是自己本該對應的值3.本地線程對象示範
import threadingimport time# 本地線程對象local_values = threading.local()def func(num): """ # 第一個線程進來,本地線程對象會為他建立一個 # 第二個線程進來,本地線程對象會為他建立一個 { 線程1的唯一標識:{name:1}, 線程2的唯一標識:{name:2}, } #注意這裡是我自己假設的 :param num: :return: """ local_values.name = num # 線程停下來了 time.sleep(2) # 第二個線程: local_values.name,去local_values中根據自己的唯一標識作為key,擷取value中name對應的值 print(local_values.name, threading.current_thread().name)for i in range(5): th = threading.Thread(target=func, args=(i,), name=‘線程%s‘%i) th.start()
結果
1 線程10 線程03 線程32 線程24 線程4
使用本地線程,每次線程進來後(執行函數),都會建立一個當前線程的唯一標識,並把本地線程的值儲存起來,形成一一對應的關係,後面即使線程等待了,也不會全部將值變成最後一個,當然線程執行順序不能確定,但是它對應的值肯定是他執行函數時她的唯一標識所對應的值
參考Flask上下文源碼就知道他就是為每個線程建立唯一標識,這裡參考她的源碼把本地線程的結構設計的和她的一樣
Python 本地線程