python多執行緒之Lock版生產者消費者模式

2021-08-29 16:36:23 字數 2444 閱讀 1573

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...