會產生執行緒衝突的多執行緒寫法與改造,給廁所加個鎖

2021-08-09 14:10:05 字數 2428 閱讀 4596

注意,這是個死迴圈,開始執行後如需結束,手動停止執行

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