• Python 多进程编程之 进程间的通信(Queue)


    Python 多进程编程之 进程间的通信(Queue)

    1,进程间通信
    Process有时是需要通信的,操作系统提供了很多机制来实现进程之间的通信,而Queue就是其中的一个方法
    ----这是操作系统开辟的一个空间,可以让各个子进程把信息放到Queue中,也可以把自己需要的信息取走
    ----这就相当于系统给python开辟了一个聊天室,让python创建的子进程可以在这个聊天室里畅所欲言
    ----一个进程可以放多条消息到Queue中

    2,实例

    #导入Queue,Process
    from multiprocessing import Queue,Process
    import os
    
    #写入进程
    def wp(q):
        print("%s开始写入:"%os.getpid)
        for i in "WANG":
            #将信息写入队列
            q.put(i)
            print(i)
    
    #读取进程
    def rd(q):
        print("%s开始读取"%os.getpid())
        while True:
            if not q.empty():
                #从队列读取信息
                print("read to %s"%q.get())
    
    if __name__=="__main__":
        #创建队列
        q = Queue()
    
        #创建写入进程
        w = Process(target=wp,args=(q,))
        #启动写入进程
        w.start()
    
        #创建读取进程
        r = Process(target=rd,args=(q,))
        #启动读取进程
        r.start()    
    

    3,执行结果

    1265开始读取
    <built-in function getpid>开始写入:
    W
    A
    N
    G
    read to W
    read to A
    read to N
    read to G
    

    4,进程间通信常用函数

    q.Queue()
    --------------------------------------------------------
     def __init__(self, maxsize=-1):
            self._maxsize = maxsize
    ----   maxsize=-1,表示队列个数无穷大
    ----   初始化Queue对象时,(例,q=Queue()  )
    或括号中没有指定最大可接收的消息数量,或数量为负值,
    那么就表示可接收的消息数量没有上限
    
    q.put("信息")
    ---------------------------------
    将信息放入队列中
    def put(self, obj, block=True, timeout=None):
        pass
    obj----传入的信息
    block=True----阻塞=真  :  真阻塞(默认值)
    timeout=None----等待时间,None(默认值)表示无限等待, 如果timeou设置值,则会等待N秒后,强制放入(put)
    
    q.get()
    ----------------------------------
    def get(self, block=True, timeout=None):
         pass
    从队列中拿出一个进程消息
    block=True 默认值是真阻塞,
    timeout=None 意思是  无限,无穷
    两个合在一起的意思是  无限阻塞,无穷等待
    队列的特点是:先进先出 所以get拿的顺序也是,先进先出 first in first out 
    
    q.put_nowait()
    -------------------------------------
    def put_nowait(self, obj):
        pass
    
    相当于q.put(obj,False)
    不等待,直接放入
    
    q.get_nowait()
    ----------------------------------------
    def get_nowait(self):
          pass
    
    不做等待,就是要获取
    如果队列中没有消息,就会报错
    ----解决报错,加入try 异常处理
    
    q.qsize()
    ------------------------------------
        def qsize(self):
            return 0
    
    返回当前队列包含的消息数量
    
    q.full()
    ------------------------------
    检测队列是否已经满了
    True: 满
    False: 未满
    
    q.empty()
    ---------------------------------
        def empty(self):
            return False
    
    检测队列是否为空
    True:空
    False:未空
    
  • 相关阅读:
    js string to int
    有的事情是无可奈何的,有的事情是能够改变的……
    拼接字符串去掉最后多余的串,JSON的遍历
    git入门
    js的闭包
    nodejs系列(二)REPL交互解释 事件循环
    nodejs系列(一)安装和介绍
    学习mongo系列(十一)关系
    学习mongo系列(十)MongoDB 备份(mongodump)与恢复(mongorerstore) 监控(mongostat mongotop)
    学习mongo系列(九)索引,聚合,复制(副本集),分片
  • 原文地址:https://www.cnblogs.com/Fantinai/p/8433136.html
Copyright © 2020-2023  润新知