Client端代码:

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. import pika
  4. import uuid
  5. import time
  6.  
  7. class FibonacciRpcClient(object):
  8. def __init__(self):
  9. #生成socket
  10. self.connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
  11. #生成管道
  12. self.channel = self.connection.channel()
  13. #声明一个随机queue,exclusive=True会在此queue的消费者断开后,自动将queue删除
  14. result = self.channel.queue_declare(exclusive=True)
  15. #获取随机queue名
  16. self.callback_queue = result.method.queue
  17. #定义收到消息后的动作
  18. self.channel.basic_consume(self.on_response, #回调函数on_response
  19. no_ack=True,
  20. queue=self.callback_queue) #获取随机queue名
  21.  
  22. def on_response(self, ch, method, props, body):
  23. if self.corr_id == props.correlation_id: #判断uuid是否是否一致
  24. self.response = body #队列返回
  25.  
  26. def call(self, n):
  27. self.response = None
  28. self.corr_id = str(uuid.uuid4()) #生成uuid,等会发送给服务端
  29. #发送消息给服务端
  30. self.channel.basic_publish(exchange='',
  31. routing_key='rpc_queue', #路由键
  32. properties=pika.BasicProperties(reply_to=self.callback_queue, #告诉服务端将返回发到哪个队列
  33. correlation_id=self.corr_id),
  34. body=str(n)) #发送的消息
  35. while self.response is None:
  36. self.connection.process_data_events() #非阻塞版的start_consuming(),如果收到消息就执行on_response回调函数
  37. print("no msg....")
  38. time.sleep(0.5) #这里可以执行其他命令
  39. return int(self.response) #返回结果
  40.  
  41. #生成实例
  42. fibonacci_rpc = FibonacciRpcClient()
  43.  
  44. print("[x] Requesting fib(30)")
  45.  
  46. #调用call函数
  47. response = fibonacci_rpc.call(30)
  48.  
  49. print("[x] got %r " % response)

server端代码:

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. import pika
  4. import time
  5.  
  6. #生成socket
  7. connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
  8. #生成管道
  9. channel = connection.channel()
  10. #声明一个queue防止启动报错
  11. channel.queue_declare(queue='rpc_queue')
  12.  
  13. def fib(n):
  14. if n == 0:
  15. return 0
  16. elif n == 1:
  17. return 1
  18. else:
  19. return fib(n - 1) + fib(n - 2)
  20.  
  21. def on_request(ch, method, props, body):
  22. n = int(body)
  23.  
  24. print("[.] fib(%s)" % n)
  25. response = fib(n)
  26.  
  27. ch.basic_publish(exchange='',
  28. routing_key=props.reply_to,
  29. properties=pika.BasicProperties(correlation_id=props.correlation_id),
  30. body=str(response))
  31.  
  32. ch.basic_ack(delivery_tag=method.delivery_tag) #回复确认消息
  33.  
  34. #处理完这条再发下一条
  35. channel.basic_qos(prefetch_count=1)
  36. #定义收到消息动作
  37. channel.basic_consume(on_request,queue='rpc_queue')
  38.  
  39. channel.start_consuming()

Python通过RabbitMQ实现RPC的更多相关文章

  1. Python操作RabbitMQ

    RabbitMQ介绍 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现的产品,RabbitMQ是一个消息代理,从“生产者”接收消息并传递消 ...

  2. 用 Python、 RabbitMQ 和 Nameko 实现微服务

    用 Python. RabbitMQ 和 Nameko 实现微服务 原创 07-17 17:57 首页 Linux中国 "微服务是一股新浪潮" - 现如今,将项目拆分成多个独立的. ...

  3. 十一天 python操作rabbitmq、redis

    1.启动rabbimq.mysql 在""运行""里输入services.msc,找到rabbimq.mysql启动即可 2.启动redis 管理员进入cmd, ...

  4. Python之RabbitMQ的使用

    今天总结一下Python关于Rabbitmq的使用 RabbitMQ官网说明,其实也是一种队列,那和前面说的线程queue和进程queue有什么区别呢? 线程queue只能在同一个进程下进行数据交互 ...

  5. python操作rabbitmq、redis

    1.启动rabbimq.mysql 在“”运行“”里输入services.msc,找到rabbimq.mysql启动即可 2.启动redis 管理员进入cmd,进入redis所在目录,执行redis- ...

  6. RabbitMQ 实现RPC

    实现RPC 首先要弄明白,RPC是个什么东西. (RPC) Remote Procedure Call Protocol 远程过程调用协议 在一个大型的公司,系统由大大小小的服务构成,不同的团队维护不 ...

  7. python之RabbitMQ

    一.安装RabbitMQ 1. 安装erlang 1 2 3 4 tar xf otp_src_18.3.tar.gz cd otp_src_18.3 ./configure --prefix=/ma ...

  8. Python之路【第九篇】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

    Python之路[第九篇]:Python操作 RabbitMQ.Redis.Memcache.SQLAlchemy   Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用 ...

  9. python - 操作RabbitMQ

    python - 操作RabbitMQ     介绍 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议.MQ全称为Mess ...

随机推荐

  1. docker jvm 占用高的问题定位

    定位流程 先使用一些轻便的工具查看总体情况, 如果情况糟糕, 再使用重量级的工具 jstack       查看线程数是否过多 jstat -gc -gcutil 查看gc次数和时间是否过多, 各个分 ...

  2. 【ACM】一种排序

    一种排序 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复:还知道这个长方形的宽和长,编号.长.宽都是整数 ...

  3. php函数超实用

    DateTime DateTime::addDateTime::diffDateTime::formatDateTime::modifyDateTime::sub... * DateInterval ...

  4. Maven的学习资料收集--(二)安装m2eclipse插件

    在Eclipse中可以安装Maven插件,可以更方便的使用: 官网地址:http://www.eclipse.org/m2e/ 可以在线安装或者离线下载,之前在线安装总是失败,可能是网速的原因,找到了 ...

  5. &&运算符和||运算符的优先级问题 专题

    public class SyntaxTest { @Test public void test() { System.out.println(true || true && fals ...

  6. Json数组对象和对象数组

    Json的简单介绍 从结构上看,所有的数据最终都可以分成三种类型: 第一种类型是scalar(标量),也就是一个单独的string(字符串)或数字(numbers),比如“北京”这个单独的词. 第二种 ...

  7. ElasticSearch入门-搜索(java api)

    ElasticSearch入门-搜索(java api) package com.qlyd.searchhelper; import java.util.Map; import net.sf.json ...

  8. 本地eclipse启动tomcat后无法访问

    转自博文:http://blog.csdn.net/wqjsir/article/details/7169838/ 症状: tomcat在eclipse里面能正常启动,而在浏览器中访问http://l ...

  9. draggable与overflow同时存在,无法拖拽出父元素问题解决

    在使用jquery-ui的拖拽功能对列表内的选项拖拽时,发现无法将选项拖拽出列表的范围,一出范围就自动隐藏在列表下,查找到最后的原因是css中的overflow的原因,overflow存在则不能将选项 ...

  10. sublime相关小技巧

    1.快速建立一个新文件:Ctrl+n 2.修改多个相同符号:Ctrl+D 3.建立语言后缀的文件保存,例如我想创建PHP的语言脚本,先按Ctrl+Shift+p,打开Command Palette,输 ...