python进程之间的通信方式---------消息队列

消息队列

1.定义

     在消息传递当中,消息按照顺序传递,这种进程间通信的模式叫做消息队列,画个图帮助理解下

    

  图中有进程A和进程B,然后为了在两个进程中通信,就在内存中开辟了一个空间叫队列C,多个进程都可以对这个队列C可见, 接下来
  就是A进程往C队列里放消息,一次放一个,一次放一个消息,进程B作为接收端,一次从队列里拿出一个消息,一次
  拿出一个消息,这样看起来和管道基本差不多,但实际上是python当中,他的函数为我们做了一个同化,队列里的
  函数更加丰富,并且内部数据的组织结构不一样
3.创建队列
  1.#在内存中开辟一个队列模型,用来存放消息,任何拥有队列对象的进程都可以进行消息存放和取出
    multiprocessing-------> Queue
  2.接口函数
    1.q = Queue(maxsize=0) #创建消息队列对象
      参数:
         maxsize 默认为0,表示消息队列可以存放的消息由系统自动分配的空间而定,能存放多少个消息,由系统自动分配
         >0正整数 表示消息队列中最多可以存放多少条消息(消息个数,不看字节大小)
      返回值:
        消息队列对象
    2.q.put(‘xxx’)向消息队列存放一条消息,当消息队列满的时候会阻塞,存放的消息类型可以是数字,列表,字符串等等
    3.q.full()判断队列是否满了,满了为True,否则为False
    4.q.qsize()查看消息队列中消息的数量
    5.q.get()获取消息,每次获取一条,当消息队列为空的时候,就发生阻塞
    6.q.empty()判断消息队列是否为空,为空是True,不为空返回False
    7.put,get中block参数和timeout参数
      block默认为True,表示两个函数都是阻塞函数
      block参数为False时,表示不阻塞
      timeout 当block设置为True的时候表示超时等待时间,你可以给timeout设置时间
  3.事例
    1.判断队列是否满了
    from multiprocessing import Queue
    #创建消息队列,最多有三条
    q = Queue(3)
    #存放消息
    i = 0
    while True:
        #q.full判断队列是不是满了
        if q.full():
            print('消息队列已经满了')
            break
        q.put('博主真帅'+ str(i))
        i += 1
        print('当前队列一共有%d条消息'%q.qsize())
       打印结果为:
         消息队列已经满了
         当前队列一共有3条消息
    2.获取消息
        from multiprocessing import Queue
        #创建消息队列,最多有三条
        q = Queue(3)
        #存放消息
        i = 0
        while True:
            #q.full判断队列是不是满了
            if q.full():
                print('消息队列已经满了')
                break
            q.put('博主真帅'+ str(i))
            i += 1
            print('当前队列一共有%d条消息'%q.qsize())
            #获取消息
            for i in range(q.qsize()):
                print('获取消息%s'%q.get())
            #打印结果:
              消息队列已经满了
              当前队列一共有3条消息
              获取消息博主真帅0
              获取消息博主真帅1
              获取消息博主真帅2
    3.消息队列进程间的通信:
        from multiprocessing import Queue,Process
        from time import sleep

        def func(name,q):
            sleep(1)
            q.put('博主真帅'+str(name))


        if __name__ == '__main__':
            q = Queue()
            jobs = []
            for i in range(10):
                    p = Process(target=func,args=(i,q))
                    jobs.append(p)
                    p.start()
            #让所有子进程结束
            for i in jobs:
                    i.join()
            #先让子进程结束,消息也是可以取出来的
            while not q.empty():
                    print(q.get())
            解析:
               这段代码时10个子进程往队列里放消息(也就是10条消息),主进程把消息取出来,子进程在睡眠的时候发生了阻塞
               主进程阻塞在join,sleep睡眠之后,10个子进程把消息放入队列中,放入后子进程退出,1秒过后,join阻塞结束,
               父进程开始获取消息,就把消息读取出来了
      



猜你喜欢

转载自blog.csdn.net/weixin_39859512/article/details/80916563