Python通过RabbitMQ实现RPC
Client端代码:
- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- import pika
- import uuid
- import time
- class FibonacciRpcClient(object):
- def __init__(self):
- #生成socket
- self.connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
- #生成管道
- self.channel = self.connection.channel()
- #声明一个随机queue,exclusive=True会在此queue的消费者断开后,自动将queue删除
- result = self.channel.queue_declare(exclusive=True)
- #获取随机queue名
- self.callback_queue = result.method.queue
- #定义收到消息后的动作
- self.channel.basic_consume(self.on_response, #回调函数on_response
- no_ack=True,
- queue=self.callback_queue) #获取随机queue名
- def on_response(self, ch, method, props, body):
- if self.corr_id == props.correlation_id: #判断uuid是否是否一致
- self.response = body #队列返回
- def call(self, n):
- self.response = None
- self.corr_id = str(uuid.uuid4()) #生成uuid,等会发送给服务端
- #发送消息给服务端
- self.channel.basic_publish(exchange='',
- routing_key='rpc_queue', #路由键
- properties=pika.BasicProperties(reply_to=self.callback_queue, #告诉服务端将返回发到哪个队列
- correlation_id=self.corr_id),
- body=str(n)) #发送的消息
- while self.response is None:
- self.connection.process_data_events() #非阻塞版的start_consuming(),如果收到消息就执行on_response回调函数
- print("no msg....")
- time.sleep(0.5) #这里可以执行其他命令
- return int(self.response) #返回结果
- #生成实例
- fibonacci_rpc = FibonacciRpcClient()
- print("[x] Requesting fib(30)")
- #调用call函数
- response = fibonacci_rpc.call(30)
- print("[x] got %r " % response)
server端代码:
- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- import pika
- import time
- #生成socket
- connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
- #生成管道
- channel = connection.channel()
- #声明一个queue防止启动报错
- channel.queue_declare(queue='rpc_queue')
- def fib(n):
- if n == 0:
- return 0
- elif n == 1:
- return 1
- else:
- return fib(n - 1) + fib(n - 2)
- def on_request(ch, method, props, body):
- n = int(body)
- print("[.] fib(%s)" % n)
- response = fib(n)
- ch.basic_publish(exchange='',
- routing_key=props.reply_to,
- properties=pika.BasicProperties(correlation_id=props.correlation_id),
- body=str(response))
- ch.basic_ack(delivery_tag=method.delivery_tag) #回复确认消息
- #处理完这条再发下一条
- channel.basic_qos(prefetch_count=1)
- #定义收到消息动作
- channel.basic_consume(on_request,queue='rpc_queue')
- channel.start_consuming()
Python通过RabbitMQ实现RPC的更多相关文章
- Python操作RabbitMQ
RabbitMQ介绍 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现的产品,RabbitMQ是一个消息代理,从“生产者”接收消息并传递消 ...
- 用 Python、 RabbitMQ 和 Nameko 实现微服务
用 Python. RabbitMQ 和 Nameko 实现微服务 原创 07-17 17:57 首页 Linux中国 "微服务是一股新浪潮" - 现如今,将项目拆分成多个独立的. ...
- 十一天 python操作rabbitmq、redis
1.启动rabbimq.mysql 在""运行""里输入services.msc,找到rabbimq.mysql启动即可 2.启动redis 管理员进入cmd, ...
- Python之RabbitMQ的使用
今天总结一下Python关于Rabbitmq的使用 RabbitMQ官网说明,其实也是一种队列,那和前面说的线程queue和进程queue有什么区别呢? 线程queue只能在同一个进程下进行数据交互 ...
- python操作rabbitmq、redis
1.启动rabbimq.mysql 在“”运行“”里输入services.msc,找到rabbimq.mysql启动即可 2.启动redis 管理员进入cmd,进入redis所在目录,执行redis- ...
- RabbitMQ 实现RPC
实现RPC 首先要弄明白,RPC是个什么东西. (RPC) Remote Procedure Call Protocol 远程过程调用协议 在一个大型的公司,系统由大大小小的服务构成,不同的团队维护不 ...
- 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 ...
- Python之路【第九篇】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy
Python之路[第九篇]:Python操作 RabbitMQ.Redis.Memcache.SQLAlchemy Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用 ...
- python - 操作RabbitMQ
python - 操作RabbitMQ 介绍 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议.MQ全称为Mess ...
随机推荐
- docker jvm 占用高的问题定位
定位流程 先使用一些轻便的工具查看总体情况, 如果情况糟糕, 再使用重量级的工具 jstack 查看线程数是否过多 jstat -gc -gcutil 查看gc次数和时间是否过多, 各个分 ...
- 【ACM】一种排序
一种排序 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复:还知道这个长方形的宽和长,编号.长.宽都是整数 ...
- php函数超实用
DateTime DateTime::addDateTime::diffDateTime::formatDateTime::modifyDateTime::sub... * DateInterval ...
- Maven的学习资料收集--(二)安装m2eclipse插件
在Eclipse中可以安装Maven插件,可以更方便的使用: 官网地址:http://www.eclipse.org/m2e/ 可以在线安装或者离线下载,之前在线安装总是失败,可能是网速的原因,找到了 ...
- &&运算符和||运算符的优先级问题 专题
public class SyntaxTest { @Test public void test() { System.out.println(true || true && fals ...
- Json数组对象和对象数组
Json的简单介绍 从结构上看,所有的数据最终都可以分成三种类型: 第一种类型是scalar(标量),也就是一个单独的string(字符串)或数字(numbers),比如“北京”这个单独的词. 第二种 ...
- ElasticSearch入门-搜索(java api)
ElasticSearch入门-搜索(java api) package com.qlyd.searchhelper; import java.util.Map; import net.sf.json ...
- 本地eclipse启动tomcat后无法访问
转自博文:http://blog.csdn.net/wqjsir/article/details/7169838/ 症状: tomcat在eclipse里面能正常启动,而在浏览器中访问http://l ...
- draggable与overflow同时存在,无法拖拽出父元素问题解决
在使用jquery-ui的拖拽功能对列表内的选项拖拽时,发现无法将选项拖拽出列表的范围,一出范围就自动隐藏在列表下,查找到最后的原因是css中的overflow的原因,overflow存在则不能将选项 ...
- sublime相关小技巧
1.快速建立一个新文件:Ctrl+n 2.修改多个相同符号:Ctrl+D 3.建立语言后缀的文件保存,例如我想创建PHP的语言脚本,先按Ctrl+Shift+p,打开Command Palette,输 ...