• 并发编程 之 互斥锁


    一,互斥锁:

    可以将要执行任务的部分代码(只涉及到修改共享数据的代码)变成串行。

    硬盘上的数据可以共享。内存中的数据是物理隔离开的。

    join:是要执行任务的所有代码整体串行。

    模拟 强票小软件

    from multiprocessing import Process,Lock
    import json,os,time,random
    def check(): #查看余票
    time.sleep(1) #模拟时间延迟
    with open('db.txt','rt',encoding='utf-8') as f: #读取余票数
    dic=json.load(f) #数据存在硬盘中,从硬盘把字典读出来,需要反序列化
    print('%s 查看剩余票数%s'%(os.getpid(),dic['count']))
    def get(): #购票
    with open('db.txt','rt',encoding='utf-8') as f : #先读真正还剩票数
    dic=json.load(f)
    time.sleep(2)
    if dic['count']>0: #判断如果票数大于0,说明还有票
    dic['count']-=1 #购票后,票数减1
    time.sleep(random.randint(1,3))
    with open('db.txt','wt',encoding='utf-8') as f: #记录票数购买后的状态
    json.dump(dic,f)
    print('%s 购票成功'% os.getpid())
    else:
    print('%s 没有余票'% os.getpid())
    def task(mutex): #制作子进程
    check() #查票函数调用(可以并发进程)
    mutex.acquire() #购票需要串行操作,一个买完之后,释放掉锁,才能下一个再来买,
    get() #购票
    mutex.release() #释放锁
    if __name__ == '__main__':
    mutex=Lock() #制作互斥锁
    for i in range(10): #十个用户并发操作。
    p=Process(target=task,args=(mutex,))
    p.start()
  • 相关阅读:
    CSS优化,提高性能的方法有哪些?
    稀疏数组(SparseArray)(Go)
    Go
    Vue 实战-6 rest 重置表单不生效原因
    Go
    Vue 实战-5 批量导出 excel功能
    Vue 实战-4 表格展开行
    Vue 实战-3 vue 中使用watch 监听 el-input属性值
    Vue 实战-2 输入框加搜索图标
    Vue 实战-1 去掉 input [number] 默认增减箭头样式
  • 原文地址:https://www.cnblogs.com/fxc-520520/p/9300580.html
Copyright © 2020-2023  润新知