from multiprocessing import Process
import json
import time
from multiprocessing import Lock
def show(i):
with open('ticket') as f:
dic = json.load(f)#load直接打開文件, 不用read, loads操作字符串,需要read
print('余票: %s' % dic['ticket'])
def buy_ticket(i,lock):
lock.acquire() ##拿到鑰匙進門,其他進程阻塞, acqurie和release之間的代碼只能被一個進程執行
with open('ticket') as f:
dic = json.load(f)#load直接打開文件, 不用read, loads操作字符串,需要read
time.sleep(0.1)
if dic['ticket'] > 0 :
dic['ticket'] -=1
print('\033[32m%s買到票了\033[0m'%i) #console改為綠色
else:
print('\033[31m%s沒有買到票了\033[0m'%i) #console改為紅色
time.sleep(0.1)
with open('ticket', 'w') as f:
json.dump(dic,f) #修改json文件,減去被買去的票
lock.release() #釋放鑰匙
if __name__ == '__main__':
for i in range(10):
p = Process(target=show, args=(i,))
p.start()
lock = Lock() #產生鑰匙
for i in range(10):
p = Process(target=buy_ticket, args=(i,lock))
p.start()
#沒有進程鎖是, 會出現多個用戶都買到票的情況, 但是只有一張票
#進程鎖
>>>
余票: 1
余票: 1
余票: 1
余票: 1
余票: 1
余票: 1
余票: 1
余票: 1
5買到票了
余票: 0
2沒有買到票了
余票: 0
4沒有買到票了
0沒有買到票了
8沒有買到票了
1沒有買到票了
7沒有買到票了
9沒有買到票了
3沒有買到票了
6沒有買到票了