日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python中的threading_python中的threading模块使用说明

發布時間:2024/7/5 python 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python中的threading_python中的threading模块使用说明 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這段時間使用python做串口的底層庫,用到了多線程,對這部分做一下總結。實際用完了后再回過頭去看python的官方幫助文檔,感覺受益匪淺,把里面的自己覺得有用的一些關鍵點翻譯出來,留待后續查驗。

threading是thread的高級接口模塊,包括了除了thread模塊,還有mutex模塊、queue模塊、dummy_threading模塊方面的內容。

該模塊定義了一下幾方面的函數和對象:

threading.activeCount() :返回現存在活動狀態的線程數。返回的數目等于enumerate()列表的長度。

threading.Condition():是返回一個新的condition變量類型的工廠函數(返回對象的函數)。一個condition類型的變量允許一個或多個線程等待,直到被另一個線程通知。

threading.currentThread() :根據用戶線程句柄,返回當前的線程對象。如果線程句柄并未通過threading模塊創建,有限功能的啞線程會被創建。

threading.enumerate() :返回所有活動線程對象列表。包括守護線程、由current_thread()創建的啞線程以及主線程。不包括終止了的線程和未開始的線程。

threading.Event() :是返回一個新的event類型的工廠函數。一個event管理一個標識,可以使用set()方法設置為true,也可以由clear()方法重置為false。wait()方法會阻塞直到這個標識為true。

class threading.local:代表線程本地數據的類。線程本地數據是該線程獨有的。通過創建一個local實例,可以管理線程本地數據,并且能存儲其屬性。如:

mydata = threading.local()

mydata.x = 1

該屬性的值因線程不同而異。

threading.Lock() :是一個返回新的單鎖對象的工廠函數。只要一個線程獲取該鎖,相關其他要獲取該鎖的線程都會阻塞,直到鎖被釋放。任何線程都可以釋放它。

eg:

testLock=threading.Lock()

testLock.acquire()#對鎖的使用,也可以不用acquire()和release,直接使用with testLock:即可

self._test=True

testLock.release()

(注意:互斥鎖用來鎖定不同線程中的互斥量,鎖的內容盡可能簡潔,只鎖定必須互斥的部分,以節省線程運轉的時間)

threading.RLock() :返回一個可重入鎖的工廠函數。可重入鎖必須由創建它的線程釋放。一旦一個線程獲取了一個可重入鎖,同一線程內可以繼續獲取它而不阻塞。線程獲取了幾次可重入鎖,必須釋放同樣的次數。

(在此次項目實踐中,重鎖沒有用到,但知道了這樣的場景,即同一線程,如果鎖中間調用的函數,有用到同樣的鎖,如果用單鎖,會發生死鎖,而用可重入鎖,不會發生阻塞,可以防止這樣場景下的死鎖。)

threading.Semaphore([value]) :是返回一個新的信號量對象的工廠函數。信號量管理一個計數器,代表調用release()的個數減去調用acquire(),再加上初始值的數目。當該值為負數時,acquire()方法會阻塞。value的默認值是1。

(當時考系統分析師,對于信號量總是理解的很抽象,其實就是控制線程同步和互斥量的。當初創建這一概念的科學家使用p()和V()取代了acquire()和release()。信號量管理一個內部計數器,每調用一個acquire()就遞減一次,每調用release()就遞增一次。這個計數器不能小于0。一旦調用acquire()時發現它小于0,則線程阻塞,直到其他線程調用release()。)

class threading.Thread:代表線程句柄的類。

threading用于提供線程相關的操作,線程是應用程序中工作的最小單元。python當前版本的多線程庫沒有實現優先級、線程組,線程也不能被停止、暫停、恢復、中斷。

thread是線程類,有兩種使用方法,直接傳入要運行的方法(推薦,簡便)或從thread繼承并覆蓋run()。一旦線程對象被創建,必須調用線程的start()方法開始線程。這一操作會喚醒每個線程的run()方法。當線程開始后,這個線程被認為是活動的。當它的run()方法終結,線程就結束了,或者通常的做法是,是觸發一個不能處理的異常。可以用is_alive()方法判斷線程是否活動。

其他線程可以調用某個線程的join()方法。這會阻塞當前上下文環境的線程,直到調用此方法的線程終止。

一個線程可以被標識為“守護線程”。當所有子線程為守護線程時,如果主線程結束,則所有子線程也就結束了。比較優雅的退出方法是引入event拋出異常。

class threading.Thread(group=None, target=None, name=None, args=(), kwargs={})

group:必須是none,留待后續擴展應用。

target:被調用的函數對象

name:線程名,可默認不填,由系統自動創建

args:調用函數對象的傳參,是一個元祖類型

kwargs:函數傳參,是字典類型

如果子類重載了此構造函數,必須在對此線程操作之前,在子類中顯式調用構造函數(thread.__init__())

start():每個線程中只能最多調用一次,否則會拋出運行錯誤。

run():在子類中重載此方法。

join([timeout]):等待直到線程終結。這會阻塞當前上下文環境的線程,直到調用此方法的線程終止或超時。

(因此當所有子線程結束后,主線程才會結束)

isAlive():返回該線程是否活動。

daemon:setDaemon()必須在線程啟動start()之前調用,否則會拋出運行錯誤異常。

condition對象:一個condition對象通常和某種鎖關聯。condition變量擁有acquire()和release()方法,可調用相應的鎖。還有wait()方法,notify()方法和notifyall()方法,但這三種方法必須在獲取到鎖之后進行,否則會拋出運行錯誤異常。

class threading.Condition([lock]) :如果參數lock給出,必須是Lock或RLock的對象。

acquire(*args):獲取一個基礎鎖。

release() :釋放鎖

wait([timeout]) :等待,直到被通知或者超時。如果線程沒有獲取到鎖,而調用了這個方法,則會拋出運行錯誤異常。

此消息會釋放基礎鎖,然后阻塞直到因為在另一線程的同樣的condition變量被notify或notifyAll()喚醒,一旦喚醒或超時,會重新獲取鎖并返回(好拗口,直白的意思就是“我累了,休息會兒,資源你們先拿去用”,然后要等待其他獲取鎖的線程,調用條件變量的notify或者nofityAll方法,才能把原有等待的線程喚醒繼續執行)。

如果鎖是一個可重入鎖,并不能通過release方法被釋放,原因是當它被鎖了好多次的時候,這可能并沒有真的解開鎖。然而,一個可重入鎖磊的內部接口被使用,這可以真的解開鎖即便鎖被獲取了多次。

notify(n=1):默認情況下,喚醒一個等待的情況變量。

Event對象:這是最簡單的線程間通信機制之一:一個線程釋放一個event事件,而其他線程捕捉它。

一個event對象管理一個內部標識可以通過set()方法設為true,也可以通過clear()方法設為false。wait()方法會阻塞,直到該標識為True。默認是False

set():設置該標識為True。所有等待它為True的線程會被喚醒。調用wait()的線程,一旦該標識為True就不會再阻塞。

clear():設置該標識為false。相應地,調用wait的線程會阻塞,直到調用set方法把標識設為true

wait():當內部標識為true時阻塞。如果該內部標識一開始就是true,直接返回。否則,會阻塞知道其他線程調用se()把標識設為true,或者直到可選的超時發生。

總結

以上是生活随笔為你收集整理的python中的threading_python中的threading模块使用说明的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。