5. python多进程锁-实现简易抢票

一、主题

  • Lock类与RLock类相同:由于进程之间随机调度:某进程可能执行n条后,CPU接着执行其他进程。为了多个进程同时操作一个内存中的资源时不产生混乱,我们使用锁。
  • Lock类与RLock类的区别:无论是Lock还是RLock,提供的方法都非常简单,acquire和release。但是Lock和RLock的区别是什么呢?RLock允许在同一线程中被多次acquire。而Lock却不允许这种情况。注意:如果使用RLock,那么acquire和release必须成对出现,即调用了n次acquire,必须调用n次的release才能真正释放所占用的锁。

二、多进程实现简易抢票程序

ticket

{"ticket":1}

抢票程序

from multiprocessing import Process
from multiprocessing import Lock
import time
import json

def show_ticket(i):
    time.sleep(0.1)
    with open('ticket') as f:
        dic = json.load(f)
        print('余票: %s' %dic.get('ticket'))

def buy_ticket(i, lock):
    lock.acquire() #加锁
    with open('ticket') as f:
        dic = json.load(f)
        time.sleep(0.1)
        if dic.get('ticket') >0:
            dic['ticket'] -= 1
            print('\033[32m%s买到票了\033[0m' %i)
        else:
            print('\033[31m%s没买到票\033[0m' %i)
    time.sleep(0.1)
    with open('ticket', 'w')as f:
        json.dump(dic, f)
    lock.release() #释放锁
if __name__ == '__main__':
    for i in range(10):
        p = Process(target=show_ticket, args=(i,) )
        p.start()
    lock = Lock()
    for i in range(10):
        p1 = Process(target=buy_ticket, args=(i,lock))
        p1.start()
    原文作者:花间派I风月
    原文地址: https://www.jianshu.com/p/961b8b554eef
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞