zoukankan      html  css  js  c++  java
  • python学习笔记 day36 锁

    1. 锁-并发编程中用来确保数据安全

    应用----抢票:

    方法一: 不使用锁,直接开多个进程实现抢票:(by myself)

    from multiprocessing import Process,Lock
    import json
    
    def search_ticket(i):  # i 表示第i个进程执行的任务
        with open("ticket") as f:
            ticket_num=json.load(f)["count"]
            return ticket_num
    def get_ticket(i):  # i表示第i个进程执行的任务
        ticket_num=search_ticket(i)
        if ticket_num:
            with open("ticket","w",encoding="utf-8") as f:
                json.dump({"count":ticket_num-1},f)  # 抢到一张票后需要把余票进行减一操作,然后使用json.dump(content,f)写进文件中
            print(i,"抢到票了")
        else:
            print(i,"没有抢到票")
    
    if __name__=="__main__":
        for i in range(20):
            p=Process(target=get_ticket,args=(i,))
            p.start()

    运行结果:

    上面的方法虽然也完成了抢票的功能(这里运行并没有出错,但是总感觉是有问题的,因为同时开多个进程,有可能在同一时间多个进程同时操作同一个文件,读写混乱,最好不要这样写)

    方法二: 使用并发编程(开多个进程来实现)和 锁 来实现抢票(就是同一时间只有一个进程可以操作数据,不是所以进程都操作同一个文件,保证了数据的安全性)--(by Eva)

    from multiprocessing import Process,Lock
    import json
    def search_ticket(i):  # 查看余票,i表示第i个进程
        with open("ticket") as f:
            ticket_num=json.load(f)["count"]  # 使用json的load把字符串形式的字典{"count":4} 转化为字典
            print(i,"还有余票%s"%ticket_num)
    
    def get_ticket(i): # i 表示第i个进程
        with open("ticket") as f:
            ticket_num=json.load(f)["count"]
        if ticket_num:  # 如果还有余票
            with open("ticket","w",encoding="utf-8") as f:  # 当还有余票时,才进行购买,然后往文件中更新票数
                json.dump({"count":ticket_num-1},f)  # 购买一张票,更新余票(把字典使用json.dump(content,f)写进文件f中)
                print(i,"抢到票了")
        else:
            print(i,"未能抢到票")
    def task(i,lock):
        search_ticket(i)  # 所有进程都可以同时查看余票,但是购买票在同一时间只有一个进程来操作
        lock.acquire()    # 需要锁,拿钥匙 该时间只有一个进程会执行下面的get_ticket()
        get_ticket(i)     # 拿到钥匙的进程执行购买操作
        lock.release()    # 购买完之后,释放锁,归还钥匙
    
    if __name__=="__main__":
        lock=Lock()  # 创建一个锁对象
        for i in range(20):
            p=Process(target=task,args=(i,lock))
            p.start()

    运行结果:

     

    talk is cheap,show me the code
  • 相关阅读:
    C# WinForm界面上实现按条件检索数据
    DevExpress中XtraEditors.RadioGroup 控件如何保存获取选中的值及读取数据库中的值
    在QTP Test中利用vbs和cmd实现重新启动QTP
    VBS操作Excel的一点问题总结
    利用vbs维护qtp的虚拟对象的坐标
    Smoke Test和BVT Test的区别
    小结一下VS2012新开发环境的设置经历
    关闭EF4.x Code First的级联删除Cascade Delete
    关于Entity Framework 4.0/4.1数据验证的一点体会
    CentOS 6.3 Minimal yum 安装 PostgreSQL 9.2.3
  • 原文地址:https://www.cnblogs.com/xuanxuanlove/p/9771615.html
Copyright © 2011-2022 走看看