• 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('33[32m%s买到票了33[0m'%i) #console改为绿色
        else:
            print('33[31m%s没有买到票了33[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没有买到票了
    
    
    
  • 相关阅读:
    关于float和double类型能表示的数据范围和精度分析
    P2737 [USACO4.1]麦香牛块Beef McNuggets 数学题 + 放缩思想
    csu 1554: SG Value 思维题
    csu 1551: Longest Increasing Subsequence Again BIT + 思维
    Rasheda And The Zeriba Gym
    cpc,a wonderful concert
    hdu_3308 区间合并
    poj_3667线段树区间合并
    poj_2777线段树+位运算
    poj_3468,线段树成段更新
  • 原文地址:https://www.cnblogs.com/konglinqingfeng/p/9687349.html
Copyright © 2020-2023  润新知