rpc_server.py
# !/usr/bin/env python3.5
# -*- coding:utf-8 -*-
# __author__ == 'LuoTianShuai'
"""
RPC/Server端
"""
import pika
# 添加认证信息
credentials = pika.PlainCredentials("admin", "admin")
connection = pika.BlockingConnection(pika.ConnectionParameters("192.168.31.123", 5672, "/", credentials))

# 添加一个通道
channel = connection.channel()
# 添加一个队列,这个队列在Server就是我们监听请求的队列
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)

# 应答函数,它是我们接受到消息后如处理的函数替代原来的callback
def on_request(ch, method, props, body):
n = int(body)
print(" [.] fib(%s)" % n)
response = fib(n)

ch.basic_publish(exchange='',
# 返回的队列,从属性的reply_to取出来
routing_key=props.reply_to,
# 添加correlation_id,和Client进行一致性匹配使用的
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)
# 定义接收通道的属性/定义了callback方法,接收的队列,返回的队列在哪里?on_request 的routing_key=props.reply_to
channel.basic_consume(on_request, queue='rpc_queue')

# 开始接收消息
print(" [x] Awaiting RPC requests")
channel.start_consuming()

rpc_client.py
# !/usr/bin/env python3.5
# -*- coding:utf-8 -*-
# __author__ == 'LuoTianShuai'
"""
RPC/Client端
"""
import pika
import uuid

# 定义菲波那切数列RPC Client类调用RPC Server
class FibonacciRpcClient(object):
def __init__(self):
# 添加认证信息
credentials = pika.PlainCredentials("admin", "admin")
self.connection = pika.BlockingConnection(pika.ConnectionParameters("192.168.31.123", 5672, "/", credentials))
# 添加一个通道
self.channel = self.connection.channel()
# 生成一个随机队列-定义callback回调队列
result = self.channel.queue_declare(exclusive=True)
self.callback_queue = result.method.queue
# 定义回调的通道属性
self.channel.basic_consume(self.on_response, # 回调结果执行完执行的Client端的callback方法
no_ack=True,
queue=self.callback_queue)
# 这里注意我们并没有直接阻塞的开始接收消息了

# Client端 Callback方法
def on_response(self, ch, method, props, body):
if self.corr_id == props.correlation_id:
# 定义了self.response = body
self.response = body

def call(self, n):
# 定义了一个普通字段
self.response = None
# 生成了一个uuid
self.corr_id = str(uuid.uuid4())
# 发送一个消息
self.channel.basic_publish(exchange='', # 使用默认的Exchange,根据发送的routing_key来选择队列
routing_key='rpc_queue', # 消息发送到rpc_queue队列中
# 定义属性
properties=pika.BasicProperties(
reply_to=self.callback_queue, # Client端定义了回调消息的callback队列
correlation_id=self.corr_id, # 唯一值用来做什么的?request和callback 匹配用
),
body=str(n))

# 开始循环 我们刚才定义self.response=None当不为空的时候停止`
while self.response is None:
# 非阻塞的接受消息
self.connection.process_data_events(time_limit=3)
return int(self.response)

# 实例化对象
fibonacci_rpc = FibonacciRpcClient()

print(" [x] Requesting fib(30)")
# 发送请求计算菲波那切数列 30
response = fibonacci_rpc.call(30)
print(" [.] Got %r" % response)

工作机制.py的更多相关文章

  1. android 6.0 高通平台sensor 工作机制及流程(原创)

    最近工作上有碰到sensor的相关问题,正好分析下其流程作个笔记. 这个笔记分三个部分: sensor硬件和驱动的工作机制 sensor 上层app如何使用 从驱动到上层app这中间的流程是如何 Se ...

  2. Java IO工作机制分析

    Java的IO类都在java.io包下,这些类大致可分为以下4种: 基于字节操作的 I/O 接口:InputStream 和 OutputStream 基于字符操作的 I/O 接口:Writer 和 ...

  3. malloc 函数工作机制(转)

    malloc()工作机制 malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表.调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块.然后,将 ...

  4. springMVC工作机制和框架搭建配置说明

    先说一下springMVC的工作机制 1.springmvc把 所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责对请求进行真正的处理工作. 2.Dispatcher ...

  5. CKPT进程工作机制

    CKPT进程工作示意图 2.CKPT进程工作机制 检查点进程被触发的条件为: a> 当发生日志组切换时: b>  用户提交了事务时(commit): c>  Redo log buf ...

  6. 15 sql base line 工作机制

    <个人Configuration> 正常配置一下, 就OK了, 不用理了, oracle 11g 默认启动 发展: .从Oracle的发展角度来看,估计这种方法是Oracle发展和改进的方 ...

  7. HBase读写路径的工作机制

    出处:http://wuyudong.com/1946.html HBase 写路径工作机制 在HBase 中无论是增加新行还是修改已有的行,其内部流程都是相同的.HBase 接到命令后存下变化信息, ...

  8. PHP自动加载__autoload的工作机制

    PHP自动加载__autoload的工作机制 PHP的懒加载lazy loading 在 2011年11月12日 那天写的     已经有 4559 次阅读了 感谢 参考或原文   服务器君一共花费了 ...

  9. hadoop MapReduce 工作机制

    摸索了将近一个月的hadoop , 在centos上配了一个伪分布式的环境,又折腾了一把hadoop eclipse plugin,最后终于实现了在windows上编写MapReduce程序,在cen ...

随机推荐

  1. Swagger UI 用法

    Swagger - 简书https://www.jianshu.com/p/4115f2b53983 Swagger简介 - Ghost Stories - CSDN博客https://blog.cs ...

  2. IdentityServer4【QuickStart】之切换到混合流并且添加API访问

    切换到混合流并且添加API访问 前面的示例中我们开发了API访问和用户认证,现在我们要将两个合并到一起. OpenID Connect&OAuth 2.0组合的美妙之处是,你可以使用单一协议和 ...

  3. C#复习笔记(3)--C#2:解决C#1的问题(实现迭代器的捷径)

    实现迭代器的捷径 从这个题目上可以看到C#1实现一个迭代器模式的话是多么的痛苦,我自己也写过不下40行的代码来实现一个迭代器,C#中的迭代器模式是通过IEnumerable和他的泛型等价物IEnume ...

  4. C#设计模式之2:单例模式

    在程序的设计过程中很多时候系统会要求对于某个类型在一个应用程序域中只出现一次,或者是因为性能的考虑,或者是由于逻辑的要求,总之是有这样的需求的存在,那在设计模式中正好有这么一种模式可以来满足这样的要求 ...

  5. mybtis逆向工程实战教程--条件查询

    mabitis逆向工程进行条件查询:

  6. MySQL简介及安装

    一.DBA工作内容及课程体系 二.MySQL课程体系介绍 三.DBA的职业素养 四.MySQL简介及安装 01 什么是数据? 02 什么是数据库管理系统 03 数据库管理系统种类 04 MySQL发展 ...

  7. vue & iview

    vue & iview ui components https://codepen.io/webgeeker/pen/EJmQxQ https://www.iviewui.com/docs/g ...

  8. pip install MySQL-python 失败

    1. EnvironmentError: mysql_config not found原因:/usr/bin/mysql_config没有次文件,要安装libmysqlclient-dev, apt ...

  9. Python memecache

    memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载,故常用来做数据库缓存.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态 ...

  10. JS--操作DOM树

    <ul id="ul1"> <li id="li1">111</li> <li id="li2"& ...