import random
import threading
import time
# Lock = threading.Lock() # 創(chuàng)建一個(gè)線程鎖。Lock.acquire()表示鎖住,線程進(jìn)入阻塞(暫停)。Lock.release()表示釋放(線程繼續(xù))
books = 10 # 圖書館書籍?dāng)?shù)量
b_rt = 0 # 外面持有數(shù)量(借出去的數(shù)量)
day = 0 # 計(jì)算天數(shù)
# 圖書館向外租借書
def rent_book():
global b_rt, books
Lock = threading.Lock() # 建鎖
locked = False # 判斷是否鎖住,初始未加鎖
while True:
time.sleep(1)
check = True if books > 0 else False # 判斷是否有書
if not check: # 沒書
print('圖書館沒有書了')
if not locked: # 沒書還未加鎖的話,加鎖
Lock.acquire()
locked = True
continue # 沒有書跳過本次循環(huán)(不管有沒有加鎖)
if check and locked: # 加鎖肯定沒書。所以如果有書且加鎖了,可以解鎖
Lock.release()
locked = False
n = random.randint(1, books) if books > 1 else 1
n = books if books < n else n
books -= n
b_rt += n
print(f"借出去了{(lán)n}本,還剩{books},外面{b_rt}")
# 外面持有書籍歸還圖書館
def return_book():
global b_rt, books
Lock = threading.Lock()
locked = False
while True:
time.sleep(2)
check = True if b_rt > 0 else False
if not check:
if not locked:
Lock.acquire()
locked = True
continue
if check and locked:
Lock.release()
locked = False
m = random.randint(1, b_rt) if b_rt > 1 else 1
books += m
b_rt -= m
print(f"歸還{m}本,還剩{books},外面{b_rt}")
# 圖書館隔段時(shí)間會(huì)補(bǔ)充一本
def buyabook():
global books, day
day += 1
print(f"這是第{day}天:\t圖書館有書{books}本\t", end="")
books += 1
print("進(jìn)書1本")
t = threading.Timer(10, buyabook)
# Timer對(duì)象第一個(gè)參數(shù)是step間隔,第二個(gè)是方法(在方法內(nèi)可以是方法本身)
t.start() # 表示調(diào)用一次函數(shù)會(huì)單獨(dú)啟用一個(gè)線程
t1 = threading.Thread(target=rent_book, args=()) # 創(chuàng)建借書線程
t2 = threading.Thread(target=return_book, args=()) # 創(chuàng)建還書線程
# threading.Thread(target=func, args=()) 中target是方法,args是方法的元組形式的參數(shù),
buyabook() # Timer任務(wù)會(huì)獨(dú)立啟用一個(gè)線程
t1.start()
t2.start()
下面面向?qū)ο蟮慕嵌瓤淳€程文章來源:http://www.zghlxwxcb.cn/news/detail-702410.html
import threading
import time
# 創(chuàng)建一個(gè)線程類
class Eat(threading.Thread):
def __init__(self, name, s: int):
# 類繼承要注意super函數(shù),這里的target可以不寫,默認(rèn)是run。目的是線程啟動(dòng)調(diào)用的是run方法
super(Eat, self).__init__(target=self.run)
self.name = name
self.s = s # 定義一個(gè)時(shí)間間隔
self.flag = False # 定義一個(gè)標(biāo)記(線程結(jié)束標(biāo)記)
def run(self): # 構(gòu)建主函數(shù)。線程啟動(dòng)后運(yùn)行的是此方法
while True:
time.sleep(self.s)
print(f"{self.name}在吃飯")
if self.flag: # 標(biāo)記為True結(jié)束線程
break
def stop(self): # 定義個(gè)方法設(shè)置標(biāo)記為True
self.flag = True
print("線程終止")
if __name__ == '__main__':
aron = Eat("aron", 2)
aron.start() # 線程啟動(dòng)后會(huì)持續(xù)運(yùn)行
# 再實(shí)例一個(gè)線程
lily = Eat("lily", 1)
lily.start()
# 所有線程都運(yùn)行再一個(gè)進(jìn)程上,他們單獨(dú)運(yùn)行互不影響。除非他們調(diào)用了進(jìn)程上的公共屬性
# 比如你可以把時(shí)間設(shè)置為進(jìn)程上的一個(gè)變量,例如:
# step = 2
# aron = Eat("aron", step)
# lily = Eat("lily", step)
print("線程啟動(dòng)后會(huì)獨(dú)立于主線程") # 線程啟動(dòng)后會(huì)獨(dú)立于主線程。下面的內(nèi)容是獨(dú)立于被啟動(dòng)的兩個(gè)線程的
time.sleep(5)
aron.stop()
lily.stop()
那么你可以試試看能不能用面向?qū)ο蟮姆椒▽?shí)現(xiàn)生產(chǎn)者消費(fèi)者模型吧。文章來源地址http://www.zghlxwxcb.cn/news/detail-702410.html
python隊(duì)列與多線程——生產(chǎn)者消費(fèi)者模型
到了這里,關(guān)于Python多線程Thread——生產(chǎn)者消費(fèi)者模型 python隊(duì)列與多線程——生產(chǎn)者消費(fèi)者模型的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!