注意,這是個死迴圈,開始執行後如需結束,手動停止執行
#coding:utf-8
import threading
import time
import random
#定義全域性變數
money = 0
#生產者
defprocuder
():while
true:
global money#設定全域性
random_money = random.randint(10,100)#隨機10-100
money += random_money#將值新增進來
print('生產者%s-生產了%d元' %(threading.current_thread(),random_money))
time.sleep(0.5)#為了效果,延遲執行
#消費者
defcustomer
():while
true:
global money
random_money = random.randint(10,100)
#判斷一下,如果現有金額大於消費金額,則可消費
if money > random_money:
print('消費者%s-消費了%d元' % (threading.current_thread(), random_money))
money -= random_money
else:
print('餘額為%d,消費金額為%d,餘額不足,不許消費' %(money,random_money))
time.sleep(0.5)
defpc_test
():#執行3個執行緒當做生產者
for v in range(3):
th = threading.thread(target=procuder)
th.start()
#執行3個執行緒當做消費者
for v in range(3):
th = threading.thread(target=customer)
th.start()
if __name__=="__main__":
pc_test()
上廁所的人多,你來我往,安全點還是加個鎖
以下為加過鎖的寫法
#coding:utf-8
import threading
import time
import random
#定義全域性變數
money = 0
#定義全域性鎖
glock = threading.lock()
#生產者
defprocuder
():while
true:
global money#設定全域性
random_money = random.randint(10,100)#隨機10-100
glock.acquire()# 加鎖
money += random_money#將值新增進來
glock.release()#解鎖
print('生產者%s-生產了%d元' %(threading.current_thread(),random_money))
time.sleep(0.5)#為了效果,延遲執行
#消費者
defcustomer
():while
true:
global money
random_money = random.randint(10,100)
#判斷一下,如果現有金額大於消費金額,則可消費
if money > random_money:
print('消費者%s-消費了%d元' % (threading.current_thread(), random_money))
glock.acquire() # 加鎖
money -= random_money
glock.release() # 解鎖
else:
print('餘額為%d,消費金額為%d,餘額不足,不許消費' %(money,random_money))
time.sleep(0.5)
defpc_test
():#執行3個執行緒當做生產者
for v in range(3):
th = threading.thread(target=procuder)
th.start()
#執行3個執行緒當做消費者
for v in range(3):
th = threading.thread(target=customer)
th.start()
if __name__=="__main__":
pc_test()
為什麼會產生執行緒 以及多執行緒的壞處
為什麼會產生執行緒,執行緒的產生主要是解決什麼問題?1 使用多執行緒可以減少程式的響應時間。2 與程序相比,執行緒的建立和切換開銷更小。建立許多資料結構來維護執行緒 段 資料段等資訊,而執行於同乙個程序內的執行緒共享同乙個 段 資料段,執行緒的啟動或切換的開銷就比程序要少到很多。3 多cpu和多核心...
多執行緒併發產生的原因
背景 先看下面一段 看看執行結果 class program public class accounttest 有乙個accounttest類,類裡面有乙個account值,有乙個add方法功能是把account值累加100萬次 main方法裡面開啟了兩個任務,兩個任務共用乙個accounttest...
QSerialPort適應多執行緒應用的改進
類unix系統的裝置介面使用了基於select的事件驅動,這使得裝置物件必須存在於某乙個執行緒中,而因為select事件無法直接從裝置跨執行緒傳輸,雙工裝置的跨執行緒操作也無法直接實現。qt作為跨平台的開發庫,為相容類unix系統的事件驅動,也設計為類似的限制。對於全雙工串列埠的qserialpor...