python中RabbitMQ的使用(远程过程调用RPC)
在RabbitMQ消息队列中,往往接收者、发送者不止是一个身份。例如接接收者收到消息并且需要返回给发送者。
此时接收者、发送者的身份不再固定!
我们来模拟该情形:
假设有客户端client,服务端server。
我们需要从客户端发送数据,通过服务端的计算后再返回给客户端。
client.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pika
import uuid class Client(object):
def __init__(self):
hostname = '192.168.1.133'
parameters = pika.ConnectionParameters(hostname)
self.connection = pika.BlockingConnection(parameters) self.channel = self.connection.channel()
# 定义接收返回消息的队列
result = self.channel.queue_declare(exclusive=True)
self.callback_queue = result.method.queue self.channel.basic_consume(self.on_response,
no_ack=True,
queue=self.callback_queue)
self.response = None
self.corr_id = '' # 定义接收到返回消息的处理方法
def on_response(self, ch, method, props, body):
if self.corr_id == props.correlation_id:
self.response = body def request(self, n):
# self.response = None
self.corr_id = str(uuid.uuid4())
# 发送计算请求,并声明返回队列
self.channel.basic_publish(exchange='',
routing_key='count_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()
return int(self.response) client = Client() print " [*] Requesting fib(30)"
response = client.request(30)
print " [*] Got fib(30)= %r" % response
server.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pika hostname = '192.168.1.133'
parameters = pika.ConnectionParameters(hostname)
connection = pika.BlockingConnection(parameters) # 创建通道
channel = connection.channel()
# 声明队列
channel.queue_declare(queue='count_queue')
print ' [*] Waiting for n' # 算法
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)
response = fib(n)
print " [*] fib(%s)" % n, '=', response
# 将结果反馈
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='count_queue')
print " [*] Awaiting count_queue requests"
channel.start_consuming()
结果如下:
服务端: 客户端:

python中RabbitMQ的使用(远程过程调用RPC)的更多相关文章
- RabbitMQ九:远程过程调用RPC
定义 RPC(Remote Procedure Call Protocol)——远程过程调用协议:它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议 ...
- RabbitMQ入门教程(八):远程过程调用RPC
原文:RabbitMQ入门教程(八):远程过程调用RPC 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.cs ...
- rabbitMQ学习3-RPC远程过程调用
将一个函数运行在远程计算机上并且等待获取那里的结果,这个称作远程过程调用(Remote Procedure Call)或者 RPC. RPC是一个计算机通信协议. 比喻 将计算机服务运行理解为厨师做饭 ...
- RabbitMQ 实现远程过程调用RPC
RPC调用的顺序1. 在客户端初始化的时候,也就是SimpleRpcClient类初始化的时候,它会随机的创建一个callback队列,用于存放服务的返回值,这个队列是exclusive的.连接断开就 ...
- Thrift架构~从图中理解thrift,它事实上是一种远程过程调用
thrift为我们简化了tcp通讯,它可以使用我们方便的建立各种语言的服务端与客户端,并实现客户端对服务器的远程过程调用,简单的说就是服务器通过thrift架构对外开放一些接口,并自己实现这些接口,如 ...
- Python操作rabbitmq系列(六):进行RPC调用
此刻,我们已经进入第6章,是官方的最后一个环节,但是,并非本系列的最后一个环节.因为在实战中还有一些经验教训,并没体现出来.由于马上要给同事没培训celery了.我也来不及写太多.等后面,我们再慢慢补 ...
- Python中函数的定义必须在调用的前面
# -*- coding:utf-8 -*- Python中函数的定义必须在调用的前面,但是在函数的内部调用一个函数,不用考虑顺序,只要被调用的函数被定义了即可 #标准的先函数定义,后函数调用def ...
- Python中if __name__=="__main__" 语句在调用多进程Process过程中的作用分析
2018年2月27日 于创B515 引言 最近准备学习一下如何使用Python中的多进程.在翻看相关书籍.网上资料时发现所有代码都含有if __name__=="__main__" ...
- RabbitMQ学习系列(五): RPC 远程过程调用
前面讲过一些RabbitMQ的安装和用法,也说了说RabbitMQ在一般的业务场景下如何使用.不知道的可以看我前面的博客,http://www.cnblogs.com/zhangweizhong/ca ...
随机推荐
- spring配置redis
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...
- Installation Guide of Ubuntu 14.04, 64bit on Dell Server
Installation Guide of Ubuntu 14.04, 64bit on Dell Server 准备:U盘(已通过ultraiso刻录ISO镜像). 1.插入U盘: 2.启动服务器, ...
- 1. AMQP 0-9-1模型简介(官网直译)
关于这篇指导文档 本文提供了AMQP 0-9-1协议的一个概述,它是RabbitMQ所支持的协议之一. AMQP 0-9-1是什么 AMQP 0-9-1(Advanced Message Queuin ...
- React Native原生模块向JS传递数据的几种方式(Android)
一般情况可以分为三种方式: 1. 通过回调函数Callbacks的方式 2. 通过Promises的异步的方式 3. 通过发送事件的事件监听的方式. 参考文档:传送门
- SPA中,Node路由优先级高于React路由
一.问题描述 在一场面试中,面试官问到了React和Node路由之间的关系. 现在SPA(单页面应用)的使用越来越广. Node(后台)和React(前端)都有自己的路由,当我页面访问一个URL的时候 ...
- 解決 Android Studio 不停 Indexing 的問題(Updating Indices: Indexing paused due to batch update)
遇到這個問題通常是 IDE 更新後,或是反覆使用 Android Studio 開啟其他專案所導致,解決方法其實非常簡單喔! 点击 這個選項的功用是「清除 IDE 暫存並重啟」,沒錯,會出現上述情形的 ...
- Linux简单入门
1.目录切换命令 cd usr 切换到该目录下usr目录 cd ../ 切换到上一层目录 cd / 切换到系统根目录 cd ~ 切换到用户主目录 cd - 切换到上一个所在目录 2.目录的操作命令 1 ...
- vscode 常用扩展推荐
1.扩展推荐 Beautify Beautify code in place for VS Code CSS Formatter Formatter for CSS ESLint ...
- Python Appium 元素定位方法简单介绍
Python Appium 元素定位 常用的八种定位方法(与selenium通用) # id定位 driver.find_element_by_id() # name定位 driver.find_ ...
- Unity 通过代码简单实现文理的灰化显示
1.可以用于纹理的处理,也可用于模型显示的处理(比如某件准备或者服饰未获取的时候,灰化显示) 线上对比图: using System.Collections; ...