Python並發編程-多進程進程鎖


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沒有買到票了



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM