1. 程式人生 > >《python核心程式設計》讀書筆記-threading模組

《python核心程式設計》讀書筆記-threading模組

簡介

在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()

執行結果
在這裡插入圖片描述