1. 程式人生 > >進程加鎖處理,防止競爭帶來的錯亂結果

進程加鎖處理,防止競爭帶來的錯亂結果

div 靈活 結果 range utf 實現 程序 eas 查看

互斥鎖:模擬購票系統(join 可以實現串行運行程序,但是join的操作不夠靈活)

數據文件 ‘db.json‘ 的格式為 {“count”: 1,...}

from multiprocessing import Process, Lock
import json
import time
import random
import os


def search():
    time.sleep(0.1)
    with open(‘db.json‘,‘r‘, encoding=‘utf-8‘) as f:
        dic = json.load(f)
        print(‘%s正在查票%s‘%(os.getpid(),dic[‘count‘]))
        return dic[‘count‘]

def get():
    with open(‘db.json‘, ‘r‘, encoding=‘utf-8‘) as f:
        dic = json.load(f)
        if dic[‘count‘] > 0:
            dic[‘count‘] -= 1
            time.sleep(random.randint(1,3))
            with open(‘db.json‘, ‘w‘, encoding=‘utf-8‘) as f:
                json.dump(dic, f)
            print(‘%s 購票成功‘%os.getpid())


def task(lock):
  ##lock.acquire() ###只能一個一個的查看余票數,但是這樣做不合理。 search() ###並發查票 lock.acquire() ###大家可以共同查找網站余票,在同一時間看到的票數相同。 購票的時候搶鎖 lock.acquire() get() ###查看完余票之後才能去購票,購票的過程模擬先到先得。不能同時多個人得到同一張余票 lock.release() ### # def task(): # search() # get() if __name__ == ‘__main__‘: lock = Lock() for i in range(10): p = Process(target=task, args= (lock,)) # p = Process(target=task) p.start()

  

進程加鎖處理,防止競爭帶來的錯亂結果