Python多執行緒,併發

2021-09-14 03:41:03 字數 1900 閱讀 7301

單執行緒程式只有乙個「手指」。但多執行緒的程式有多個「手指」。每個「手指」仍然移動到控制流語句定義的下一行**,但這些「手指」可以在程式的不同地方,同時執行不同的**行

你可以使用 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...