python---RabbitMQ(5)消息RPC(远程过程调用)
服务器端:
import pika #创建socket
connection = pika.BlockingConnection(pika.ConnectionParameters(
host='localhost')) #获取通道
channel = connection.channel() #生成队列
channel.queue_declare(queue='rpc_queue') def fib(n):
'''用于获取斐波那契数列'''
if n == :
return
elif n == :
return
else:
return fib(n - ) + fib(n - ) 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=)
#预备开始消费
channel.basic_consume(on_request, queue='rpc_queue') print(" [x] Awaiting RPC requests")
#开始消费,从客户端获取
channel.start_consuming()
客户端:
import pika
import uuid class FibonacciRpcClient(object):
def __init__(self):
#生成socket连接
self.connection = pika.BlockingConnection(pika.ConnectionParameters(
host='localhost'))
#生成管道连接
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)
#注意,在这里不使用start_consuming去获取数据,因为这样会堵塞再这里,我们使用了另一种方法self.connection.process_data_events()
def on_response(self, ch, method, props, body):
print("on_response")
if self.corr_id == props.correlation_id:
self.response = body def call(self, n):
self.response = None
#生成一个唯一标识符
self.corr_id = str(uuid.uuid4())
#先向服务器端发送数据,传递属性有:唯一队列名和唯一标识符
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:
print("process_data_events start")
self.connection.process_data_events()
print("process_data_events end")
return int(self.response) fibonacci_rpc = FibonacciRpcClient() print(" [x] Requesting fib(30)")
response = fibonacci_rpc.call()
print(" [.] Got %r" % response)
注意:
self.connection.process_data_events()会去队列中获取处理数据事件,当数据来临的时候,会直接去调用回调函数去处理数据
process_data_events start
process_data_events end
process_data_events start
process_data_events end
process_data_events start
process_data_events end
process_data_events start
process_data_events end
process_data_events start
process_data_events end
process_data_events start
process_data_events end
process_data_events start
process_data_events end
process_data_events start
process_data_events end
process_data_events start
process_data_events end
process_data_events start
process_data_events end
process_data_events start
process_data_events end
process_data_events start #事件到来
on_response #调用回调函数去处理数据
process_data_events end #事件结束
[.] Got
python---RabbitMQ(5)消息RPC(远程过程调用)的更多相关文章
- rabbitmq(中间消息代理)在python中的使用
在之前的有关线程,进程的博客中,我们介绍了它们各自在同一个程序中的通信方法.但是不同程序,甚至不同编程语言所写的应用软件之间的通信,以前所介绍的线程.进程队列便不再适用了:此种情况便只能使用socke ...
- [译]RabbitMQ教程C#版 - 远程过程调用(RPC)
先决条件 本教程假定 RabbitMQ 已经安装,并运行在localhost标准端口(5672).如果你使用不同的主机.端口或证书,则需要调整连接设置. 从哪里获得帮助 如果您在阅读本教程时遇到困难, ...
- rabbitmq系列五 之远程过程调用(RPC)
1.远程过程调用(RPC) 在第二篇教程中我们介绍了如何使用工作队列(work queue)在多个工作者(woker)中间分发耗时的任务. 可是如果我们需要将一个函数运行在远程计算机上并且等待从那儿获 ...
- .Net RabbitMQ之消息通信 构建RPC服务器
1.消息投递服务 RabbitMQ是一种消息投递服务,怎么理解这句话呢?即RabbitMQ即不是消息的生产者,也是消息的消费者.他就像现实生活中快递模式,消费者在电商网站上下单买了一件商品,此时对应的 ...
- Python RabbitMQ消息队列
python内的队列queue 线程 queue:不同线程交互,不能夸进程 进程 queue:只能用于父进程与子进程,或者同一父进程下的多个子进程,进行交互 注:不同的两个独立进程是不能交互的. ...
- 【python】-- RabbitMQ 队列消息持久化、消息公平分发
RabbitMQ 队列消息持久化 假如消息队列test里面还有消息等待消费者(consumers)去接收,但是这个时候服务器端宕机了,这个时候消息是否还在? 1.队列消息非持久化 服务端(produc ...
- Python之路-python(rabbitmq、redis)
一.RabbitMQ队列 安装python rabbitMQ module pip install pika or easy_install pika or 源码 https://pypi.pytho ...
- python RabbitMQ队列/redis
RabbitMQ队列 rabbitMQ是消息队列:想想之前的我们学过队列queue:threading queue(线程queue,多个线程之间进行数据交互).进程queue(父进程与子进程进行交互或 ...
- Python—RabbitMQ
RabbitMQ RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统 安装 因为RabbitMQ由erlang实现,先安装erlang #安装配置epel源 rpm -ivh http ...
- twsited(5)--不同模块用rabbitmq传递消息
上一章,我们讲到,用redis共享数据,以及用redis中的队列来实现一个简单的消息传递.其实在真实的过程中,不应该用redis来传递,最好用专业的消息队列,我们python中,用到最广泛的就是rab ...
随机推荐
- ### Error building SqlSession.
org.apache.ibatis.exceptions.PersistenceException: ### Error building SqlSession.### The error may e ...
- SpringMVC 常用注释
@Controller Controller控制器是通过服务接口定义的提供访问应用程序的一种行为 @Repository Dao层的标志 @RequestMapping 标注控制层函数的访问路径 ...
- c#窗体移动与窗体阴影效果
//步骤//1.导入代码//2.事件中添加form_1mousedown函数//3.在load函数中定义AnimateWindow语句,注意有两个引用.//4.DllImport若有错误,按shift ...
- Leetcode题库——19.删除链表的倒数第 n 个节点【##】
@author: ZZQ @software: PyCharm @file: removeNthFromEnd.py @time: 2018/9/26 21:56 说明:给定一个链表,删除链表的倒数第 ...
- grunt入门讲解6:grunt使用步骤和总结
Grunt是啥? 很火的前端自动化小工具,基于任务的命令行构建工具. Grunt能帮我们干啥? 假设有这样一个场景: 编码完成后,你需要做以下工作 HTML去掉注析.换行符 - HtmlMin CSS ...
- Pascal-S代码注释
注释参考博文 http://www.cnblogs.com/luxiaodou/p/6025124.html 注释代码 https://github.com/Hesitater/Pascal-S-Co ...
- PHP中测试in_array、isset、array_key_exists性能
测试in_array.isset.array_key_exists性能.自己写的简易测试代码: ini_set('display_errors',true); error_reporting(E_AL ...
- JAVA里面的“指针”
JAVA里面的“指针” 众所周知,在java里面是没有指针的.那为何此处还要说java里面的“指针”呢?我们知道在C/C++中,指针是指向内存中的地址.那么在Java里 ...
- MT【126】点对个数两题之二【图论】
在平面上有\(n\) 个点$S={x_1,x_2\cdots,x_n}, $ 证明在这 \(n\) 个点中距离为 \(1\) 的点对数不超过 \(\dfrac{n}{4}+\dfrac{2}{2}n^ ...
- wazuh官方安装指南(中文译版本)
安装Wazuh服务器 Wazuh服务器可以安装在任何类型的Unix操作系统上.最常见安装在Linux上.如果可以为您的系统提供自动化脚本,则安装过程会更容易,但是,从源码构建和安装也非常简单. 通 ...