摘要:為了避免改亂為,我們在前面已經提到說要加鎖。僅供一個線程使用,線程間相互不影響。例如下列程序中函數中定義的變量就是局部變量。所有綁定的參數都是線程隔離的。下面展示一下代碼創建一個全局的對象初始化一個線程內變量,該變量線程間互不影響。
我們在編寫多線程程序的時候,往往會遇到兩種類型的變量。
一種是全局變量,多個線程共享。為了避免改亂為,我們在前面已經提到說要加鎖。
一種是局部變量。僅供一個線程使用,線程間相互不影響。
例如下列程序中task()函數中定義的count變量就是局部變量。即使我們創建了兩個線程,兩者的count遞增也不會相互影響,因為count是在task中定義的。
import threading def task(): count = 0 for i in range(1000): count += 1 print count if __name__ == "__main__": t1 = threading.Thread(target=task) t1.start() t2 = threading.Thread(target=task) t2.start()
那么,這么處理是不是就完美了呢?其實還不是。
以上的例子我們舉的是一個非常簡單的例子,但是我們遇到一個比較復雜的業務邏輯的時候,比如多個局部變量,函數多重調用等,這么定義局部變量就會變得不簡潔,麻煩。
函數多重調用是指,例如:
我們定義了函數,methodA(),這個方法體內調用了methodB(), methodB()方法體中又調用了methodC()...
如果我們在某一個線程中調用了methodA()并且使用了一個變量attr,那么我們就需要將attr一層一層地傳遞給后續的函數。
有沒有一種方法,能讓我們在線程中定義一個變量后,那么這個線程中的函數就都能調用,如此才叫簡潔明了?
Python為我們做到了,那就是ThreadLocal.
ThreadLocal的用法只需要三步:
定義一個對象 threading.local
在線程內給該對象綁定參數。所有綁定的參數都是線程隔離的。
在線程內調用。
下面展示一下代碼:
# coding=utf-8 import threading local = threading.local() # 創建一個全局的對象 def task(): local.count = 0 # 初始化一個線程內變量,該變量線程間互不影響。 for i in range(1000): count_plus() def count_plus(): local.count += 1 print threading.current_thread().name, local.count if __name__ == "__main__": t1 = threading.Thread(target=task) t1.start() t2 = threading.Thread(target=task) t2.start()
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/38436.html
摘要:底層是一個的散列表可擴容的數組,并采用開放地址法來解決沖突。稍后討論方法每個對象都有一個值,每初始化一個對象,值就增加一個固定的大小。因此在使用的時候要手動調用方法,防止內存泄漏。 ThreadLocal定義 先看JDK關于ThreadLocal的類注釋: This class provides thread-local variables. These variables diffe...
摘要:通過向消息池發送各種消息事件通過處理相應的消息事件。子線程往消息隊列發送消息,并且往管道文件寫數據,主線程即被喚醒,從管道文件讀取數據,主線程被喚醒只是為了讀取消息,當消息讀取完畢,再次睡眠。 目錄介紹 6.0.0.1 談談消息機制Hander作用?有哪些要素?流程是怎樣的? 6.0.0.2 為什么一個線程只有一個Looper、只有一個MessageQueue,可以有多個Handle...
摘要:在深入理解中的變量上中我們看到的引入,使得可以很方便地在多線程環境中使用局部變量。特別需要注意的是,基類的并不會屏蔽派生類中的創建。到此,整個源碼核心部分已經理解的差不多了,只剩下用來執行清除工作。 在 深入理解Python中的ThreadLocal變量(上) 中我們看到 ThreadLocal 的引入,使得可以很方便地在多線程環境中使用局部變量。如此美妙的功能到底是怎樣實現的?如果你...
摘要:在子線程中發送消息,主線程接受到消息并且處理邏輯。子線程往消息隊列發送消息,并且往管道文件寫數據,主線程即被喚醒,從管道文件讀取數據,主線程被喚醒只是為了讀取消息,當消息讀取完畢,再次睡眠。 目錄介紹 1.Handler的常見的使用方式 2.如何在子線程中定義Handler 3.主線程如何自動調用Looper.prepare() 4.Looper.prepare()方法源碼分析 5....
摘要:具體怎么實現的呢,思想其實特別簡單,我們在深入理解中的變量上一文的最后有提起過,就是創建一個全局字典,然后將線程或者協程標識符作為,相應線程或協程的局部數據作為。 在上篇我們看到了 ThreadLocal 變量的簡單使用,中篇對python中 ThreadLocal 的實現進行了分析,但故事還沒有結束。本篇我們一起來看下Werkzeug中ThreadLocal的設計。 Werkzeug...
閱讀 1909·2021-11-24 11:16
閱讀 3262·2021-09-10 10:51
閱讀 3209·2021-08-03 14:03
閱讀 1268·2019-08-29 17:03
閱讀 3249·2019-08-29 12:36
閱讀 2237·2019-08-26 14:06
閱讀 500·2019-08-23 16:32
閱讀 2688·2019-08-23 13:42