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> 

  • 相关阅读:
    PHP 中 define() 和 const 定义常量时的区别
    tar 解压常用压缩文件格式命令大全
    JVM的GC策略
    守护线程(Daemon Thread)
    探索HashMap实现原理及其在jdk8数据结构的改进
    Java面试& HashMap实现原理分析
    Java分布式应用
    全面理解Java内存模型
    Java& Vector与ArrayList区别
    深入理解Java虚拟机&运行时数据区
  • 原文地址:https://www.cnblogs.com/maojiang/p/8948329.html
Copyright © 2011-2022 走看看