python3爬蟲中多執行緒進行解鎖操作例項

2022-10-04 13:27:20 字數 1540 閱讀 6537

生活中我們為了保障房間裡物品的安全,所以給門進行上鎖,在我們需要進入房間的時候又會重新開啟。同樣的之間我們講過多執行緒中的lock,作用是為了不讓多個執行緒執行是出錯所以進行鎖住的指令。但是鑑於我們實際運用中,因為執行緒和指令不會只有乙個,如果全部都進行lock操作就會出錯。所以今天小編為大家進行lock的全面講解,同時為大家帶來lock的解鎖方法。

由於執行緒之間隨機排程,所以在使用共享變數時,某執行緒可能在執行n條後,cpu接著執行其他執行緒,很容易使得最終結果出錯。為了多個執行緒同時操作乙個記憶體中的資源時不產生混亂,我們可以使用鎖。

lock(指令鎖)是可用的最低階的同步指令。lock處於鎖定狀態時,不被特定的執行緒擁有。lock包含兩種狀態——鎖定和非鎖定,以及兩個基本的方法。

當執行緒請求鎖定時,其他執行緒就不能獲得這把鎖,直到鎖定的執行緒釋放鎖,其他執行緒才能繼續使用。這就好比使用獨衛,某個人進去了,把門鎖上了,另乙個人必須等待裡面的人出來才能繼續使用。

指令鎖只能被同乙個執行緒呼叫一次,如果需要多次請求,則需要了解一下可重入鎖。

rlock(可重入鎖)是乙個可以被同乙個執行緒請求多次的同步指令。rlock使用了「擁有的執行緒」和「遞迴等級」的概念,處於鎖定狀態時,rlock被某個執行緒擁有。擁有rlock的執行緒可以再次呼叫acquire(),釋放鎖時需要呼叫release()相同次數。

具體程式設計客棧方法如下:

acquire([timeout]): 請求獲得鎖定。使執行緒進入同步阻塞狀態。

release(): 釋放鎖。使用前線程必須已獲得鎖定,否則將丟擲異常。

關於執行緒的鎖的案例,這裡給出乙個簡單的指令鎖hafsjxcrah的示例,主要看下鎖的作用。

import threading

sub = 0

num = 1000000

lock = threading.lock()

def add():

global sub,num

for i in range(1,num):

# 請求鎖

lock.acquire()

sub += 1

# 釋放鎖

lock.release()

def red():

sub -= 1

def main():

print("開始運算,sub的值為{}".format(sub))

t1 = threading.thread(target=add,args=())

t2 = threading.thread(target=red,args=())

t1.start()

t2.start()

t1.join()

t2.join()hafsjxcrah

print("結束運算,sub的值為{}".format(sub))

if __name__ == '__main__':

main()

有鎖時,肯定是交替執行加減演算法,但最後結果肯定還是可以為0。

注釋鎖後,再來看下結果。

再多執行幾次後,會發現結束運算後的sub值每次都不一樣,這其實就是因為共享程式設計客棧變數,執行緒之間產生了混亂,導致sub的值無法確定。

Python3爬蟲與多執行緒

企鵝號 你收到一封新郵件 介紹這個爬蟲的目的 模組,創造原始單執行緒爬蟲 對這個爬蟲進行改造,創造多執行緒爬蟲 一 爬蟲功能介紹 文章標題取的是 python爬蟲與多執行緒 而不是 python多執行緒爬蟲 因為爬蟲的目的是為了獲取資料而非炫技。即使沒有多執行緒,單執行緒的爬蟲也可以完成任務,大不了...

python3爬蟲中如何防止多執行緒出錯?

最近的溫度已經能感受到寒冬的冷意了,動物們的遷徙也早就完成。那麼大家應該知道,為了防止遷徙途中走錯路,動物的集體遷徙是有乙個領頭的,它會帶領集體走向更溫暖的地帶,可能這點平時我們沒怎麼注意過。這種應用在多執行緒中也有體現,為了不讓其他的執行緒出現混亂,都會有乙個主線程進行控制,這就是領頭的作用,接下...

Python3多執行緒

學習python執行緒 python3 執行緒中常用的兩個模組為 thread threading 推薦使用 thread 模組已被廢棄。使用者可以使用 threading 模組代替。所以,在 python3 中不能再使用 thread 模組。為了相容性,python3 將 thread 重新命名為...