消息队列”是在消息的传输过程中保存消息的容器。
消息队列最经典的用法就是消费者和生成者之间通过消息管道来传递消息,消费者和生成者是不通的进程。生产者往管道中写消息,消费者从管道中读消息。
操作系统提供了很多机制来实现进程间的通信 ,multiprocessing模块就提供了Queue和Pipe两种方法来实现。

使用multiprocessing里面的Queue来实现消息队列

  1. from multiprocessing import Queue, Process
  2.  
  3. #写进程
  4. def write(q):
  5. for i in ["a","b","c","d"]:
  6. q.put(i)
  7. print("put {0} to queue".format(i))
  8. #读进程
  9. def read(q):
  10. while 1:
  11. result = q.get()
  12. print("get {0} from queue".format(result))
    #主函数
  1. def main():
    # 父进程创建Queue,并传给各个子进程:
    q = Queue()
    pw = Process(target=write,args=(q,))
    pr = Process(target=read,args=(q,))
        # 启动子进程pw,写入:
    pw.start()
        # 启动子进程pe,读入:
    pr.start()
    # 等待pw结束:
    pw.join()
      # pr进程里是死循环,无法等待其结束,只能强行终止:
    pr.terminate()
  2.  
  3. if __name__ == "__main__":
    main()
  1.  
  2. 结果

put a to queue

get a from queue
put b to queue

get b from queue

put c to queue

get c from queue

put d to queue
get d from queue

通过Mutiprocess里面的Pipe来实现消息队列:
1, Pipe方法返回(conn1, conn2)代表一个管道的两个端。Pipe方法有duplex参数,如果duplex参数为True(默认值),那么这个管道是全双工模式,也就是说conn1和conn2均可收发。duplex为False,conn1只负责接受消息,conn2只负责发送消息。
2, send和recv方法分别是发送和接受消息的方法。close方法表示关闭管道,当消息接受结束以后,关闭管道。

  1. from multiprocessing import Pipe,Process
  2.  
  3. import time
  4.  
  5. def proc1(pipe):
  6. for i in xrange(1,10):
  7. pipe.send(i)
  8. print("send {0} to pipe".format(i))
  9. time.sleep(1)
  10. def proc2(pipe):
  11. n = 9
  12. while n >0:
  13. result = pipe.recv()
  14. print("recv {0} from pipe".format(result))
  15. n -= 1
  16.  
  17. def main():
  18. pipe = Pipe(duplex=False)
  19. print(type(pipe))
  20. p1 = Process(target=proc1,args=(pipe[1],))
  21. p2 = Process(target=proc2,args=(pipe[0],))
  22. p1.start()
  23. p2.start()
  24. p1.join()
  25. p2.join()
  26. pipe[0].close()
  27. pipe[1].close()
  28.  
  29. if __name__ == '__main__':
  30. main()
  31.  
  32. 输出结果:
  33. <type 'tuple'>
  34. send 1 to pipe
  35. recv 1 from pipe
  36. recv 2 from pipe
  37. send 2 to pipe
  38. send 3 to pipe
  39. recv 3 from pipe
  40. send 4 to pipe
  41. recv 4 from pipe
  42. send 5 to piperecv 5 from pipe
  43.  
  44. recv 6 from pipe
  45. send 6 to pipe
  46. recv 7 from pipe
  47. send 7 to pipe
  48. recv 8 from pipe
  49. send 8 to pipe
  50. recv 9 from pipe
  51. send 9 to pipe

day42-python消息队列一的更多相关文章

  1. python消息队列snakemq使用总结

    Python 消息队列snakemq总结 最近学习消息总线zeromq,在网上搜了python实现的消息总线模块,意外发现有个消息队列snakemq,于是拿来研究一下,感觉还是很不错的,入手简单使用也 ...

  2. Python消息队列工具 Python-rq 中文教程

    原创文章,作者:Damon付,如若转载,请注明出处:<Python消息队列工具 Python-rq 中文教程>http://www.tiangr.com/python-xiao-xi-du ...

  3. Python消息队列(RabbitMQ)

    RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用.可维护多个队列,可实现消息的一对一和广播等方式发送 RabbitMQ是一个开源的AMQP实现 ...

  4. python - 消息队列

    消息队列分类 1.先进先出 2.后进先出 3.优先级队列 4.双向队列 1.先进先出 import queue q = queue.Queue(2) #队列最大长度 q.put(11) q.put(2 ...

  5. python消息队列Queue

    实例1:消息队列Queue,不要将文件命名为"queue.py",否则会报异常"ImportError: cannot import name 'Queue'" ...

  6. python 消息队列-rabbitMQ 和 redis介绍使用

    1.rabbitMQ 与ptyhon 进程queue 区别.进程queue 主要用户Python父子进程之间或者统一进程不同子进程.rabbit可以用户不同语言之前的相互交流,socket可以实现同样 ...

  7. Python并发编程-RabbitMQ消息队列

    RabbitMQ队列 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消息队列 ...

  8. python之消息队列

    引言 你是否遇到过两个(多个)系统间需要通过定时任务来同步某些数据?你是否在为异构系统的不同进程间相互调用.通讯的问题而苦恼.挣扎?如果是,那么恭喜你,消息服务让你可以很轻松地解决这些问题.消息服务擅 ...

  9. Python进阶【第二篇】多线程、消息队列queue

    1.Python多线程.多进程 目的提高并发 1.一个应用程序,可以有多进程和多线程 2.默认:单进程,单线程 3.单进程,多线程 IO操作,不占用CPU python的多线程:IO操作,多线程提供并 ...

  10. python 操作消息队列

    图示 其中P指producer,即生产者:C指consumer,即消费者.中间的红色表示消息队列,实例中表现为HELLO队列. 往队列里插入数据前,查看消息队列 $sudo rabbitmqctl l ...

随机推荐

  1. Android组件系列----Intent详解(转载笔记)

    [正文] Intent组件虽然不是四大组件,但却是连接四大组件的桥梁,学习好这个知识,也非常的重要. 一.什么是Intent 1.Intent的概念: Android中提供了Intent机制来协助应用 ...

  2. 20175312 2018-2019-2 《Java程序设计》第6周学习总结

    20175312 2018-2019-2 <Java程序设计>第6周学习总结 教材学习内容总结 已依照蓝墨云班课的要求完成了第七.十章的学习,主要的学习渠道是PPT,和书的课后习题. 总结 ...

  3. HttpClient throws TaskCanceledException on timeout

    error msg: HttpClient throws TaskCanceledException on timeout HttpClient is throwing a TaskCanceledE ...

  4. 【VS2019】F12跳转到源码

    1.工具->选项 2.文本编辑器->C#->高级->勾选支持导航到反编译源码 3.关闭浏览器不停止项目

  5. 解决IE11安装时需要“获取更新”(IE11离线安装)

    方法一:说明:目前是针对Windows7 64位操作系统安装! 1. 在C盘下新建文件夹,取名为“IE11”. 2. 将官网下载的IE11离线包放到此文件夹中. 3. win + r 打开运行窗口,输 ...

  6. Kotlin 枚举类

    枚举类最基本的用法是实现一个类型安全的枚举. 枚举常量用逗号分隔,每个枚举常量都是一个对象. enum class Color{ RED,BLACK,BLUE,GREEN,WHITE } 枚举初始化 ...

  7. leecode第二百一十七题(存在重复元素)

    class Solution { public: bool containsDuplicate(vector<int>& nums) { set<int> s; for ...

  8. toFixed()精度丢失;复选框全选、取消

    一.精度丢失和重写toFixed()函数 1.重写toFixed() Number.prototype.toFixed = function(length){ var carry = 0; //存放进 ...

  9. stm32WB55xx 外设资源

    1.FLASH(闪存) 2.Radio System(无线系统:兼容BLE5.0与IEEE802.15.4标准,由2.4GHz射频前端.BLE和IEEE802.15.4物理层控制器组成,无线低功耗协议 ...

  10. 多重线性回归 (multiple linear regression) | 变量选择 | 最佳模型 | 基本假设的诊断方法

    P133,这是第二次作业,考察多重线性回归.这个youtube频道真是精品,用R做统计.这里是R代码的总结. 连续变量和类别型变量总要分开讨论: 多重线性回归可以写成矩阵形式的一元一次回归:相当于把多 ...