zoukankan      html  css  js  c++  java
  • 互斥锁 IPC 生产者消费者

    import json
    import time
    import random
    import os
    from multiprocessing import Process,Lock
    
    mutex=Lock()
    # 互斥锁vs join的区别一:
    # 互斥锁可以让一部分代码(修改共享数据的代码)串行,而join只能将代码整体串行
    
    
    def search():
        time.sleep(random.randint(1,3))
        with open('db.json','r',encoding='utf-8') as f:
            dic=json.load(f)
            print('%s 剩余票数:%s' %(os.getpid(),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):
        search()
        lock.acquire()
        get()
        lock.release()
    
    if __name__ == '__main__':
        for i in range(10):
            p=Process(target=task,args=(mutex,))
            p.start()
    

    互斥锁得自己加锁  锁是一个危险的事  不然成死锁
    所以IPC 机制里的Queue就是帮我们自动处理锁的事
    用Queue
    队列(推荐使用)
    创建队列的类
        Queue([maxsize]):创建共享的进程队列,Queue是多进程安全的队列,
        可以使用Queue实现多进程之间的数据传递。
    参数介绍:
          maxsize是队列中允许最大项数,省略则无大小限制。
    1.队列:队列类似于一条管道,元素先进先出
    需要注意的一点是:队列都是在内存中操作,进程退出,队列清空,另外,队列也是一个阻塞的形态
    2.队列分类
    队列有很多种,但都依赖与模块queue
    q.put方法用以插入数据到队列中,put方法还有两个可选参数:blocked和timeout。如果blocked为True(默认值),并且timeout为正值,该方法会阻塞timeout指定的时间,直到该队列有剩余的空间。如果超时,会抛出Queue.Full异常。如果blocked为False,但该Queue已满,会立即抛出Queue.Full异常。
    q.get方法可以从队列读取并且删除一个元素。同样,get方法有两个可选参数:blocked和timeout。如果blocked为True(默认值),并且timeout为正值,那么在等待时间内没有取到任何元素,会抛出Queue.Empty异常。如果blocked为False,有两种情况存在,如果Queue有一个值可用,则立即返回该值,否则,如果队列为空,则立即抛出Queue.Empty异常.
      
    q.get_nowait():同q.get(False)
    q.put_nowait():同q.put(False)
     
    q.empty():调用此方法时q为空则返回True,该结果不可靠,比如在返回True的过程中,如果队列中又加入了项目。
    q.full():调用此方法时q已满则返回True,该结果不可靠,比如在返回True的过程中,如果队列中的项目被取走。
    q.qsize():返回队列中目前项目的正确数量,结果也不可靠,理由同q.empty()和q.full()一样
    
    来自 <http://www.cnblogs.com/haiyan123/p/7429568.html> 

  • 相关阅读:
    java中的 equals 与 ==
    String类的内存分配
    SVN用命令行更换本地副本IP地址
    npoi 设置单元格格式
    net core 微服务框架 Viper 调用链路追踪
    打不死的小强 .net core 微服务 快速开发框架 Viper 限流
    net core 微服务 快速开发框架 Viper 初体验20201017
    Anno 框架 增加缓存、限流策略、事件总线、支持 thrift grpc 作为底层传输
    net core 微服务 快速开发框架
    Viper 微服务框架 编写一个hello world 插件02
  • 原文地址:https://www.cnblogs.com/maojiang/p/8948329.html
Copyright © 2011-2022 走看看