服务器端:

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(远程过程调用)的更多相关文章

  1. rabbitmq(中间消息代理)在python中的使用

    在之前的有关线程,进程的博客中,我们介绍了它们各自在同一个程序中的通信方法.但是不同程序,甚至不同编程语言所写的应用软件之间的通信,以前所介绍的线程.进程队列便不再适用了:此种情况便只能使用socke ...

  2. [译]RabbitMQ教程C#版 - 远程过程调用(RPC)

    先决条件 本教程假定 RabbitMQ 已经安装,并运行在localhost标准端口(5672).如果你使用不同的主机.端口或证书,则需要调整连接设置. 从哪里获得帮助 如果您在阅读本教程时遇到困难, ...

  3. rabbitmq系列五 之远程过程调用(RPC)

    1.远程过程调用(RPC) 在第二篇教程中我们介绍了如何使用工作队列(work queue)在多个工作者(woker)中间分发耗时的任务. 可是如果我们需要将一个函数运行在远程计算机上并且等待从那儿获 ...

  4. .Net RabbitMQ之消息通信 构建RPC服务器

    1.消息投递服务 RabbitMQ是一种消息投递服务,怎么理解这句话呢?即RabbitMQ即不是消息的生产者,也是消息的消费者.他就像现实生活中快递模式,消费者在电商网站上下单买了一件商品,此时对应的 ...

  5. Python RabbitMQ消息队列

    python内的队列queue 线程 queue:不同线程交互,不能夸进程 进程 queue:只能用于父进程与子进程,或者同一父进程下的多个子进程,进行交互 注:不同的两个独立进程是不能交互的.   ...

  6. 【python】-- RabbitMQ 队列消息持久化、消息公平分发

    RabbitMQ 队列消息持久化 假如消息队列test里面还有消息等待消费者(consumers)去接收,但是这个时候服务器端宕机了,这个时候消息是否还在? 1.队列消息非持久化 服务端(produc ...

  7. Python之路-python(rabbitmq、redis)

    一.RabbitMQ队列 安装python rabbitMQ module pip install pika or easy_install pika or 源码 https://pypi.pytho ...

  8. python RabbitMQ队列/redis

    RabbitMQ队列 rabbitMQ是消息队列:想想之前的我们学过队列queue:threading queue(线程queue,多个线程之间进行数据交互).进程queue(父进程与子进程进行交互或 ...

  9. Python—RabbitMQ

    RabbitMQ RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统 安装 因为RabbitMQ由erlang实现,先安装erlang #安装配置epel源 rpm -ivh http ...

  10. twsited(5)--不同模块用rabbitmq传递消息

    上一章,我们讲到,用redis共享数据,以及用redis中的队列来实现一个简单的消息传递.其实在真实的过程中,不应该用redis来传递,最好用专业的消息队列,我们python中,用到最广泛的就是rab ...

随机推荐

  1. python service 服务没有及时响应启动或控制请求

    1053错误 代码运行没有问题后,安装服务,然而start 的时候出现错误 1053:服务没有及时响应启动或控制请求(Error 1053: The service did not respond t ...

  2. 【转】 MATLAB下如何指定GPU资源

    [转] MATLAB下如何指定GPU资源 原文链接

  3. 【CS231N】5、神经网络静态部分:数据预处理等

    一.疑问 二.知识点 1. 白化 ​ 白化操作的输入是特征基准上的数据,然后对每个维度除以其特征值来对数值范围进行归一化.该变换的几何解释是:如果数据服从多变量的高斯分布,那么经过白化后,数据的分布将 ...

  4. BETA-3

    前言 我们居然又冲刺了·三 团队代码管理github 站立会议 队名:PMS 530雨勤(组长) 过去两天完成了哪些任务 一堆deadline截至前的两天,为了图形学和编译原理毅然决然地放弃冲刺 接下 ...

  5. Java 线程间通讯

    /* 线程间通讯: 多个线程在处理同一资源,但是任务却不同. */ package com.cwcec.test; class Input implements Runnable { Resource ...

  6. JS单例模式在工作中的使用

    为了尽可能的减少全局变量的污染,在写js的时候可以采用单例模式,形式如下: 比如有一个js叫demo.js,那么我们可以在js里这样写: var demo = {} 这样做的目的是将整个js当成一个对 ...

  7. [转帖] CentOS7 与 CentOS6的对比

    来源网站: http://blog.51cto.com/fengery/1901349 centos6.x_centos7.x差异改进明细 感谢原作者 centos官方帮助文档:https://wik ...

  8. spring 中 ThreadPoolTaskExecutor 的使用

    配置文件代码如下: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="htt ...

  9. JVM内存管理机制

    Java与C++之间有一堆由内存动态分配与垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来. —— <深入理解Java虚拟机:JVM高级特性与最佳实践> Java虚拟机在 ...

  10. HDU3046_Pleasant sheep and big big wolf

    给一个n*m的数字阵,1表示羊的位置,2表示狼的位置,0表示没有东西,可以通过.在每个格子的4边都可以建立围栏,有围栏的话狼是不能通过的. 现在求最少建立多少围栏能够保证狼无法接触到羊. 题目的模型很 ...