《python核心程式設計》讀書筆記-threading模組
阿新 • • 發佈:2019-01-13
簡介
在Python提供了多個模組支援多執行緒程式設計,包括thread,threading和Queue模組等,推薦使用threading
threading模組物件
物件 | 描述 |
---|---|
Thread | 表示一個執行執行緒的物件 |
Lock | 鎖原語物件 |
RLock | 可重入鎖物件,使單一執行緒可以(再次)獲得已持有的鎖(遞迴鎖) |
Condition | 條件變數物件,使得一個執行緒等待另一個執行緒滿足特定的“條件”,比如改變狀態或某個資料值 |
Event | 條件變數的通用版本,任意數量的執行緒等待某個事件的發生,在該事件發生後所有執行緒將被啟用 |
Semaphore | 為執行緒間共享的有限資源提供了一個“計數器”,如果沒有可用資源時會被阻塞 |
BoundedSemaphore | 與 Semaphore 相似,不過它不允許超過初始值 |
Timer | 與 Thread 相似,不過它要在執行前等待一段時間 |
Barrier | 建立一個障礙,必須達到指定數量的執行緒才可以繼續 |
Thread類屬性和方法
Thread 物件資料屬性
Thread 物件資料屬性 | 描述 |
---|---|
name | 執行緒名 |
ident | 執行緒的識別符號 |
daemon | 布林標誌,表示這個執行緒是否是守護執行緒 |
Thread 物件方法
Thread 物件方法 | 描述 |
---|---|
__init__(group=None, tatget=None,args=(), kwargs ={}, verbose=None, daemon=None) | 例項化一個執行緒物件,需要有一個可呼叫的 target,以及其引數 args或 kwargs。還可以傳遞 name 或 group 引數,不過後者還未實現。此外 , verbose 標 志 也 是 可 接 受 的。 而 daemon 的 值 將 會 設定thread.daemon 屬性/標誌 |
start() | 開始執行該執行緒 |
run() | 定義執行緒功能的方法(通常在子類中被應用開發者重寫) |
join (timeout=None) | 直至啟動的執行緒終止之前一直掛起;除非給出了 timeout(秒),否則會一直阻塞 |
getName() | 返回執行緒名 |
setName (name) | 設定執行緒名 |
isAlivel /is_alive () | 布林標誌,表示這個執行緒是否還存活 |
isDaemon() | 如果是守護執行緒,則返回 True;否則,返回 False |
setDaemon(daemonic) | 把執行緒的守護標誌設定為布林值 daemonic(必須線上程 start()之前呼叫) |
建立Thread的例項1
來自《python核心程式設計》中的例程
import threading
from time import sleep,ctime
loops = [5,2]
def loop(nloop,nsec):
print('start loop',nloop,'at:',ctime())
sleep(nsec)
print('loop',nloop,'done at:',ctime())
def main():
print('starting at:',ctime())
threads=[]
nloops = range(len(loops))
for i in nloops:
t = threading.Thread(target=loop, args=(i, loops[i]))
threads.append(t)
for i in nloops:
threads[i].start()
for i in nloops:
threads[i].join()
print('all done at:',ctime())
if __name__=='__main__':
main()
執行結果
建立Thread的例項2
功能和例項1沒什麼區別,讓這個類更加通用,而不是侷限於loop()函式,因此添加了一些新東西,比如讓這個類儲存了函式的引數,函式自身,以及函式名的字串,而建構函式__init__()用於設定上述的這些值。
當建立新執行緒的時候,Thread類的程式碼將呼叫ThreadFunc物件,此時會呼叫__call__()這個特殊方法,用於已經有了需要的引數,於是就不需要再將其傳遞給Thread()的構造函數了,直接呼叫就可以了
import threading
from time import sleep,ctime
loops = [5,2]
class ThreadFunc(object):
def __init__(self,func,args,name=''):
self.name = name
self.func = func
self.args = args
def __call__(self, *args, **kwargs):
self.func(*self.args)
def loop(nloop,nsec):
print('start loop',nloop,'at:',ctime())
sleep(nsec)
print('loop',nloop,'done at:',ctime())
def main():
print('starting at:',ctime())
threads=[]
nloops = range(len(loops))
for i in nloops:
t = threading.Thread(target=ThreadFunc(loop,(i,loops[i]),loop.__name__))
threads.append(t)
for i in nloops:
threads[i].start()
for i in nloops:
threads[i].join()
print('all done at:',ctime())
if __name__=='__main__':
main()
執行結果