單執行緒程式只有乙個「手指」。但多執行緒的程式有多個「手指」。每個「手指」仍然移動到控制流語句定義的下一行**,但這些「手指」可以在程式的不同地方,同時執行不同的**行
你可以使用 python 的threading 模組,在單獨的執行緒中執行延遲或安排的**。這個單獨的執行緒將因為**time.sleep()**呼叫而暫停。同時,程式可以在原來的執行緒中做其他工作
要得到單獨的執行緒,首先要呼叫threading.thread()函式(通過類名的構造方法構造物件),生成乙個 thread 物件。
import threading,time
print('start of program.')
def takeanpa():
time.sleep(5)
print('hello world')
threadobj=threading.thread(target=takeanpa)#這裡注意一下
threadobj.start()
print('goodbey world!')
請注意,關鍵字引數是 target=takeanap,
而不是 target=takeanap()。這是因為你想將 takeanap()函式本身作為引數,而不是
呼叫 takeanap(),並傳入它的返回值。
結果:
start of program.
goodbey world!
hello world
在程式的所有執行緒終止之前,python 程式不會終止。在執行 threaddemo.py 時,
即使最初的執行緒已經終止,第二個執行緒仍然執行 time.sleep(5)呼叫。(程序沒有停)
向執行緒的目標函式傳遞引數
>>> print('cats', 'dogs', 'frogs', sep=' & ')
cats & dogs & frogs
該print()呼叫有3 個常規引數:『cats』、 『dogs』和』frogs』,以及乙個關鍵字引數:sep=
』 & '。常規引數可以作為乙個列表,傳遞給 threading.thread()中的 args 關鍵字引數。關鍵字引數可以作為乙個字典,傳遞給threading.thread()中的kwargs關鍵字引數
錯誤示範:
hreadobj = threading.thread(target=print('cats', 'dogs', 'frogs', sep=' & '))
正確示範:
>>> import threading
>>> threadobj = threading.thread(target=print, args=['cats', 'dogs', 'frogs'],
kwargs=)
>>> threadobj.start()
cats & dogs & frogs
可以輕鬆地建立多個新執行緒,讓它們同時執行。但多執行緒也可能會導致所謂的
併發問題。如果這些執行緒同時讀寫變數,導致互相干擾,就會發生併發問題。併發
問題可能很難一致地重現,所以難以除錯。
多執行緒程式設計本身就是乙個廣泛的主題,超出了本書的範圍。必須記住的是:為了避
免併發問題,絕不讓多個執行緒讀取或寫入相同的變數。當建立乙個新的thread 物件時,
要確保其目標函式只使用該函式中的區域性變數。這將避免程式中難以除錯的併發問題
python併發程式設計 多執行緒 執行緒理論
一 什麼是執行緒 在傳統作業系統中,每個程序有乙個位址空間,而且預設就有乙個控制線程 執行緒顧名思義,就是一條流水線工作的過程 流水線的工作需要電源,電源就相當於cpu 而一條流水線必須屬於乙個車間,乙個車間的工作過程是乙個程序,車間負責把資源整合到一起,是乙個資源單位,而乙個車間內至少有一條流水線...
多執行緒併發
多執行緒併發主要有3個方面 1 同步器 主要有synchronized,reentrantlock 訊號量,門栓 countdownlatch 障柵 cyclicbarrier 交換器。2 同步容器 主要包括 對映 集 佇列 對映 concurrenthashmap,concurrentskipli...
多執行緒併發
更簡單的執行緒池 多執行緒和多程序都可以很容易的實現併發,協程通過切換上下文來充分利用cpu實現併發效果 threading模組 thread類的基本狀態和行為 屬性名和值 name none,group none,target none,args kwargs daemon none 方法 sta...