python多執行緒之lock版生產者消費者模式,謹以此文記之。
本文利用多執行緒技術,模擬在python爬蟲環境中的應用,分為生產者部分和消費者部分,也就是將乙個爬蟲專案分為兩個部分,獲取將要爬的取詳細資訊的url部分,和爬取該url中的關鍵資訊的部分。生產者模擬第一部分,消費者模擬第二部分。也就是說,生產者負責生成指定的詳情頁面的url,消費者負責使用該url,獲取詳細資訊。
將整個場景模擬為賺錢和花錢。生產者賺錢,消費者花錢,當消費者發現金錢不夠花的時候,跳過,等有錢的時候再花錢。(消費者模擬再爬蟲專案未正式結束之前,生成url的**跟不上消費url的**的節奏時,跳過主要**,等到生成了相關url時,再繼續執行)
**實現:
首先,匯入三個包,以下三個包,time用於延時,random生成隨機數,threading用於建立執行緒
import time
import random
import threading
定義全域性變數,在這裡定義了乙個全域性鎖,主要是為了避免在多個執行緒處理全域性變數時,發生的紊亂問題。
gmoney = 1000 #設定初始金錢
glock = threading.lock()#建立全域性鎖
gtotletimes = 10 #定義生產者生產的總次數,模擬爬蟲需要爬取url的總數
gtimes = 0 #定義已經爬取的url數
然後,建立生產者:在生產者中,隨機生產money,將money新增到全域性gmoney中,供消費者消費,相當於爬蟲生產url新增到全域性url列表中一樣。
class producter(threading.thread):
def run(self):
global gmoney#宣告全域性變數
global gtimes
global gtotletimes
while true:
money = random.randint(100,1000)#生產隨機數量的money
glock.acquire()#開啟鎖
if gtimes >= gtotletimes:#判斷是否完成生產任務,如果完成則跳出,釋放鎖
glock.release()
break
gtimes += 1
gmoney += money#將生產的金錢新增到全域性變數中
print("%s生產者生產了%d元錢,總共有%d元錢"%(threading.current_thread(),money,gmoney))
glock.release()#釋放鎖
time.sleep(0.2)
建立消費者,隨機產生需要消費的金額,如果全域性變數中的金額足夠,則消費,否則等待再消費。
class consumer(threading.thread):
def run(self):
global gmoney
global gtimes
global gtotletimes
while true:
money = random.randint(100,1000)#生成需要消費的金額
glock.acquire()
if money <= gmoney:#如果金錢足夠,則消費
gmoney -= money
print("{}消費者消費了{}元錢,還有{}元錢".format(threading.current_thread(),money,gmoney))
else:
if gtimes >= gtotletimes:#如果生產者不在生產,金錢也不夠消費,則退出
glock.release()
break
print("消費者%s準備消費%d元錢,不足"%(threading.current_thread(),money))
glock.release()
time.sleep(0.2)
如下為主函式:
def main():
for i in range(3):#生成3個消費者
t2 = consumer(name='消費者%d'%(i))
t2.start()
for x in range(3):#生成3個生產者
t1 = producter(name='生產者{}'.format(x))
t1.start()
if __name__ == '__main__':
main()
執行如下:
生產者生產了10次,消費著在整體程式未執行結束時,有一次不足,等待之後在次消費。
結束
boost多執行緒之mutex與lock
mutex類主要有兩種 獨佔式與共享式的互斥量。獨佔式互斥量 mutex 獨佔式的互斥量,是最簡單最常用的一種互斥量型別 try mutex 它是mutex的同義詞,為了與相容以前的版本而提供 timed mutex 它也是獨佔式的互斥量,但提供超時鎖定功能 遞迴式互斥量 recursive mut...
Java 多執行緒之Lock的用法
lock 為執行緒加鎖解鎖,因為多個執行緒在訪問同乙個資源時,乙個資源不能同時給兩個執行緒進行讀寫操作.所以使用執行緒同步的方式來對資源進行訪問限制.下面來看lock的用法 使用流程 1.建立reentrantlock物件,首先,這個reentrantlock類 重入鎖 是一種遞迴無阻塞的同步機制的...
python 多執行緒 鎖Lock
在上次講gil鎖的時候 位址 有講到gil鎖也會有釋放的時候,就會導致資料的錯誤讀訪問,10萬次左右可能不會有影響,然而量級大上去,結果就不再是零了。那麼如何解決這種問題呢?這裡引入lock from threading import lock a 0 lock lock def add fun g...