消息队列

1.定义

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

    

Queue python 进程通信 python进程消息队列_multiprocessing


  图中有进程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阻塞结束,
               父进程开始获取消息,就把消息读取出来了