在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)的更多相关文章

  1. RabbitMQ九:远程过程调用RPC

    定义 RPC(Remote Procedure Call Protocol)——远程过程调用协议:它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议 ...

  2. RabbitMQ入门教程(八):远程过程调用RPC

    原文:RabbitMQ入门教程(八):远程过程调用RPC 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.cs ...

  3. rabbitMQ学习3-RPC远程过程调用

    将一个函数运行在远程计算机上并且等待获取那里的结果,这个称作远程过程调用(Remote Procedure Call)或者 RPC. RPC是一个计算机通信协议. 比喻 将计算机服务运行理解为厨师做饭 ...

  4. RabbitMQ 实现远程过程调用RPC

    RPC调用的顺序1. 在客户端初始化的时候,也就是SimpleRpcClient类初始化的时候,它会随机的创建一个callback队列,用于存放服务的返回值,这个队列是exclusive的.连接断开就 ...

  5. Thrift架构~从图中理解thrift,它事实上是一种远程过程调用

    thrift为我们简化了tcp通讯,它可以使用我们方便的建立各种语言的服务端与客户端,并实现客户端对服务器的远程过程调用,简单的说就是服务器通过thrift架构对外开放一些接口,并自己实现这些接口,如 ...

  6. Python操作rabbitmq系列(六):进行RPC调用

    此刻,我们已经进入第6章,是官方的最后一个环节,但是,并非本系列的最后一个环节.因为在实战中还有一些经验教训,并没体现出来.由于马上要给同事没培训celery了.我也来不及写太多.等后面,我们再慢慢补 ...

  7. Python中函数的定义必须在调用的前面

    # -*- coding:utf-8 -*- Python中函数的定义必须在调用的前面,但是在函数的内部调用一个函数,不用考虑顺序,只要被调用的函数被定义了即可 #标准的先函数定义,后函数调用def ...

  8. Python中if __name__=="__main__" 语句在调用多进程Process过程中的作用分析

    2018年2月27日 于创B515 引言 最近准备学习一下如何使用Python中的多进程.在翻看相关书籍.网上资料时发现所有代码都含有if __name__=="__main__" ...

  9. RabbitMQ学习系列(五): RPC 远程过程调用

    前面讲过一些RabbitMQ的安装和用法,也说了说RabbitMQ在一般的业务场景下如何使用.不知道的可以看我前面的博客,http://www.cnblogs.com/zhangweizhong/ca ...

随机推荐

  1. linux 基础命令(12月25日笔记)

    1.  cp指令指令:cp          (copy,复制)作用:复制文件/文件夹到指定的位置语法:#cp [-r] 被复制的文档路径 文档被复制到的路径选项:         -r:recurs ...

  2. layui upload 后台获取不到值

    后台获取不到值方法一: <script> layui.use('upload', function () { var upload = layui.upload; //执行实例 var u ...

  3. commons-beanutils使用介绍

    commons-beanutils是Apache开源组织提供的用于操作JAVA BEAN的工具包.使用commons-beanutils,我们可以很方便的对bean对象的属性进行操作.今天为大家介绍一 ...

  4. JaveWeb 公司项目(1)----- 使Div覆盖另一个Div完成切换效果

    最近在做网页,用的是CSS+DIV的布局方法,搭建了一个简易的界面,大体上分为三个部分,如图所示: 左侧的为主功能导航栏,右侧是具体的功能实现,下方是固定的版权声明,单击左边不同的导航按钮,在div中 ...

  5. android 利用CountDownTimer实现时分秒倒计时效果

    https://blog.csdn.net/mrzhao_perfectcode/article/details/81289578

  6. Vue中ESlint配置文件eslintrc.js文件详解

    最近在跟着视频敲项目时,代码提示出现很多奇奇怪怪的错误提示,百度了一下是eslintrc.js文件没有配置相关命令,ESlint的语法检测真的令人抓狂,现在总结一下这些命令的解释,方便以后查阅. 默认 ...

  7. joomla 的语言翻译

    最近装了留言板组件 phocaguestbook,发觉没有中文翻译. 于是在 components\com_phocaguestbook\language\en-GB 找到了英文的文件. 依葫芦画瓢, ...

  8. English trip M1 - AC11 May I Help You? 我能帮到你吗? Teacher:Lamb

    In this lesson you will learn to ask for things in shops  在本课程中,您将学习如何在商店中寻找东西 课上内容(Lesson) How are ...

  9. yarn hadoop-2.3.0 installation cluster Centos 64bits

    Apache Hadoop -2.2.0 - How to Install a Three Nodes Cluster http://tonylixu.blogspot.ca/2014/02/apac ...

  10. nodejs安装、环境配置和测试

    nodejs下载 https://nodejs.org/en/ nodejs安装 双击下载的nodejs,可自定义安装路径,安装模块部分直接next即可安装. 检查是否安装 win+R输入cmd,打开 ...