0、讲述rabbit中各部分的含义及作用

https://www.jb51.net/article/75647.htm

1、rabbitMQ的安装

1)在安装rabbitmq之前需要先安装erlang,下载地址如下:

http://www.erlang.org/downloads根据系统选择,安装按提示一直下一步就OK,安装完后,再安装rabbitmq

2、rabbitmq的下载地址:http://www.rabbitmq.com/download.html

3、rabbitmq队列

假设现在需要从武汉到北京去见一个网友,哈哈哈,先的打电话约下,然后确定路线和交通工具吧,这就是下边这段代码的实际模型

  1. import pika
  2. import random
  3.  
  4. connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) #先打电话约下,看能否找到人
  5. channel = connection.channel() #确定路线
  6. channel.queue_declare(queue='task_queue', durable=True) #确定交通工具,而且交通工具的名称叫‘task_queue',durable = True表示就是你到了北京以后交通工具依然存在
  7.  
  8. number = random.randint(1, 1000)
  9. message = 'hello world:{num}'.format(num = number)
  10.  
  11. channel.basic_publish(exchange='', #交换机,此时没有交换机参与,所以参数为空,
  12. routing_key='task_queue', #交通工具的名称
  13. body=message, #要发送给的内容
  14. properties=pika.BasicProperties(
  15. delivery_mode=2,) #表示不管路通不通,你携带的消息都不会因为外界情况而消失
  16. )
  17. print(" [x] Sent %r" % (message,))
  18. connection.close()
  1. import pika
  2. import time
  3.  
  4. hostname = 'localhost'
  5. parameters = pika.ConnectionParameters(hostname)
  6. connection = pika.BlockingConnection(parameters)
  7.  
  8. channel = connection.channel()
  9. channel.queue_declare(queue='task_queue', durable=True)
  10.  
  11. def callback(ch, method, properties, body):
  12. print(" [x] Received %r" % (body,))
  13. # time.sleep(5)
  14. print(" [x] Done")
  15. ch.basic_ack(delivery_tag=method.delivery_tag) #回调函数中需要给发布者发送的消息
  16.  
  17. channel.basic_qos(prefetch_count=1)
  18.  
  19. channel.basic_consume(callback, queue='task_queue', no_ack=False) #no_ack=False当消费者接到消息后,需要调用回掉函数告诉发布者,消息的接受情况
  20. print(' [*] Waiting for messages. To exit press CTRL+C')
  21. channel.start_consuming()

下边的代码是通过交换机来实现消息的发送的,具体如下:

  1. import pika
  2.  
  3. connection = pika.BlockingConnection(pika.ConnectionParameters(
  4. host='localhost'))
  5. channel = connection.channel()
  6.  
  7. channel.exchange_declare(exchange='logs', #交换机的名称为logs
  8. exchange_type='fanout')
  9.  
  10. message = "info: Hello World!"
  11. channel.basic_publish(exchange='logs',
  12. routing_key='',
  13. body=message)
  14. print(" [x] Sent %r" % message)
  15. connection.close()
  1. import pika
  2.  
  3. connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
  4. channel = connection.channel()
  5. channel.exchange_declare(exchange='logs', #声明交换机的名称以及交换机发送消息的模式,这的名称要和publishor的交换机的名称相同,相当于publishor和consumor同时向exchange寻找,
    #否则publishor和consumor相互找不到,会迷路!!
  6. exchange_type='fanout') #这不同的版本有可能会出错,有的说的是可以写为type = 'fanout',在我的电脑上运行会出错,
    #改为exchange_type = 'fanout'仍然会出错,后来运行cmd->service.msc->找到rabbitmq关闭后再启动就OK了,
    #至于为啥,如果你找到了,跟我说一声,先谢谢啦
  7. result = channel.queue_declare(exclusive=True) # 不指定queue名字,rabbit会随机分配一个名字,exclusive=True会在使用此queue的消费者断开后,自动将queue删除
  8. queue_name = result.method.queue #得到队列的名字
  9. channel.queue_bind(exchange='logs',
  10. queue=queue_name) #将交换机和队列的名字绑定,也就是说exchange = ‘logs'的交换机只能公国queue = queue_name来发送消息
  11. print(' [*] Waiting for logs. To exit press CTRL+C')
  12. def callback(ch, method, properties, body):
  13. print(" [x] %r" % body)
  14.  
  15. channel.basic_consume(callback,
  16. queue=queue_name,
  17. no_ack=True)
  18. channel.start_consuming()

4、rabbitmq有选择的接受消息,模型如下

更过相关内容详见:http://www.cnblogs.com/alex3714/articles/5248247.html

5、client发送给指令,server根据指令运行完毕后再将结果返回给client

  1. import pika
  2. import uuid
  3.  
  4. class FibonacciRpcClient(object):
  5. def __init__(self):
  6. self.connection = pika.BlockingConnection(pika.ConnectionParameters(
  7. host='localhost'))
  8.  
  9. self.channel = self.connection.channel()
  10.  
  11. result = self.channel.queue_declare(exclusive=True)
  12. self.callback_queue = result.method.queue
  13.  
  14. self.channel.basic_consume(self.on_response, #类中定义的方法__init__()是为了建立链接,同时定义一个callback_queue,再basic_publish中传递给server端,用于存放运行的结果
  15. no_ack=True,
  16. queue=self.callback_queue) #这里的basic_consume只是声明,如果要取消息应该取callback__queue中取
  17. def on_response(self, ch, method, props, body):
  18. if self.corr_id == props.correlation_id: #确定发的指令和收到的结果是相互对应的
  19. self.response = body
  20. def call(self, n):
  21. self.response = None
  22. self.corr_id = str(uuid.uuid4())
  23. self.channel.basic_publish(exchange='',
  24. routing_key='rpc_queue',
  25. properties=pika.BasicProperties(
  26. reply_to=self.callback_queue,
  27. correlation_id=self.corr_id,),
  28. body=str(n))
  29. while self.response is None:
  30. self.connection.process_data_events() #去队列中取数据,不停的循环,非阻塞版的start_consuming(),去调用basic_consume()
  31. return int(self.response)
  32.  
  33. fibonacci_rpc = FibonacciRpcClient()
  34. print(" [x] Requesting fib(30)")
  35. response = fibonacci_rpc.call()
  36. print(" [.] Got %r" % response)
  1. import pika
  2. import time
  3.  
  4. connection = pika.BlockingConnection(pika.ConnectionParameters(
  5. host='localhost'))
  6. channel = connection.channel()
  7. channel.queue_declare(queue='rpc_queue')
  8.  
  9. def fib(n):
  10. if n == :
  11. return
  12. elif n == :
  13. return
  14. else:
  15. return fib(n - ) + fib(n - )
  16. def on_request(ch, method, props, body): #method存放的是bsic_consume中读取数据routing_key,props中存放的是从basic_consume中读取的protperties的数据,body存放的是从发送过来的消息。
  17. n = int(body)
  18. print(" [.] fib(%s)" % n)
  19. response = fib(n)
  20. ch.basic_publish(exchange='',
  21. routing_key=props.reply_to,
  22. properties=pika.BasicProperties(correlation_id= props.correlation_id),
  23. body=str(response))
  24. ch.basic_ack(delivery_tag=method.delivery_tag)
  25.  
  26. channel.basic_qos(prefetch_count=)
  27. channel.basic_consume(on_request, queue='rpc_queue')
  28.  
  29. print(" [x] Awaiting RPC requests")
  30. channel.start_consuming()

python学习之rabbitmq的更多相关文章

  1. python 学习分享-rabbitmq

    一.RabbitMQ 消息队列介绍 RabbitMQ也是消息队列,那RabbitMQ和之前python的Queue有什么区别么? py 消息队列: 线程 queue(同一进程下线程之间进行交互) 进程 ...

  2. python学习之-- RabbitMQ 消息队列

    记录:异步网络框架:twisted学习参考:www.cnblogs.com/alex3714/articles/5248247.html RabbitMQ 模块 <消息队列> 先说明:py ...

  3. Python学习-day11 RabbitMQ Redis

    这次文章包含两个内容: 1.RabbitMQ使用 2.Redis基础操作 代码部分为练习笔记和作业 概念部分转自Alex老师 RabbitMQ 安装 http://www.rabbitmq.com/i ...

  4. python第十二天-----RabbitMQ

    有一位小伙伴说让我去A站写博客可能会有很多人喜欢,真是搞不懂,北方哪里有卖萌?北方默认状态就是这么萌的!再者说了,这明明就是很专注于技术的博客嘛,能不能严肃点!知不知道什么叫帧? 学习到了数据库的相关 ...

  5. Python学习总结:目录

    Python 3.x总结 Python学习总结[第一篇]:Python简介及入门 Python学习总结[第二篇]:Python数据结构 Python学习总结[第三篇]:Python之函数(自定义函数. ...

  6. python学习博客地址集合。。。

    python学习博客地址集合...   老师讲课博客目录 http://www.bootcdn.cn/bootstrap/  bootstrap cdn在线地址 http://www.cnblogs. ...

  7. Python学习--04条件控制与循环结构

    Python学习--04条件控制与循环结构 条件控制 在Python程序中,用if语句实现条件控制. 语法格式: if <条件判断1>: <执行1> elif <条件判断 ...

  8. Python学习--01入门

    Python学习--01入门 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.和PHP一样,它是后端开发语言. 如果有C语言.PHP语言.JAVA语言等其中一种语言的基础,学习Py ...

  9. Python 学习小结

    python 学习小结 python 简明教程 1.python 文件 #!/etc/bin/python #coding=utf-8 2.main()函数 if __name__ == '__mai ...

随机推荐

  1. nginx的错误处理

    以下是针对nginx发生错误的处理方案(将会持续更新) 遇到 nginx: [error] invalid PID number "" in "/var/run/ngin ...

  2. Java+Selenium+Testng自动化测试学习(四)— 报告

    自动化测试报告,在测试用例完成之后系统自动生成HTML报告 使用testng中的报告模板生成报告, 1.在TestSuit.xml文件中配置报告监听 2.运行xml文件 3.自动生成一个test-ou ...

  3. 用控制台编译和运行,输出HelloWorld

    HelloWorld 建立一个Java文件,文件后缀为.java(Hello.java) public class Hello{     public static void main(String[ ...

  4. 钉钉内网穿透工具在windows的使用。

    钉钉内网穿透工具在windows环境下使用 1.WIN+R,然后cmd,调出dos控制台 2.进入内网穿透程序ding.exe所在目录 3.执行 ./ding.exe -config=ding.cfg ...

  5. 「hdu 4845 」拯救大兵瑞恩 [CTSC 1999](状态压缩bfs & 分层图思想)

    首先关于分层图思想详见2004的这个论文 https://wenku.baidu.com/view/dc57f205cc175527072208ad.html 这道题可以用状态压缩,我们对于每一把钥匙 ...

  6. vue 文件插件 Vetur 设置说明官网

    vue 文件插件 Vetur 设置说明官网 https://vuejs.github.io/vetur/formatting.html#settings

  7. 为什么CSS,JS以及图片等这些资源的路径需要加问号

    我们平时练习的时候,很少写路径上面需要加问号的,而实际应用当中,我们经常看到一些资源的路径后面跟着问号,这是为什么呢? 答:答案很简单哦,其实就是为了防止缓存,我们可以在原本路径的后面加上问号,加上我 ...

  8. 各技能DBC参数

    推荐你  通过 引擎的帮助文件查找标准魔法DB 下面是 部分hero引擎的标准魔法DB 34,解毒术,2,26,16,0,0,0,0,0,2,42,50,44,100,46,200,40,, 35,老 ...

  9. 《深入浅出WPF》学习总结之Binding

    一.前言 友好的图形用户界面(Graphics User Interface ,GUI)的流行也就是近十来年的事情,之前应用程序与用户的交互是通过控制台界面(Console User Interfac ...

  10. Redis04——Redis五大数据类型 key

    key  keys *  查看当前库的所有键  exists <key>  判断某个键是否存在  type <key>   查看键的类型  del<key>  删除 ...