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. SSH上传/下载本地文件到linux服务器

    在linux下一般用scp这个命令来通过ssh传输文件. 1.从服务器上下载文件 scp username@servername:/path/filename /var/www/local_dir(本 ...

  2. 关于微信小程序使用canvas生成图片,内容图片跨域的问题

    最近有个项目是保存为名片(图片),让用户发送给朋友或朋友圈,找了很多方案都不适用,绞尽脑汁之后还是选了使用canvas,但是用这玩意儿生成图片最大的缺点就是,如果你的内容中有图片,并且这个图片是通过外 ...

  3. myeclipse部署报错报空指针异常

    hib4.1+spring3+struts2项目 项目运行报错,把WEB-INF/classes目录删除后,想再重新编译并自动部署.再自动部署时总是提示错误: Errors occurred duri ...

  4. js-其他跨域技术(JSONP`Comet)

    ###1.  JSONP JSONP由两部分组成:回调函数和数据 JSONP是通过动态<script>元素来使用的,使用时可以为src属性指定一个跨域URL eg: function ha ...

  5. spring后置处理器BeanPostProcessor

    BeanPostProcessor的作用是在调用初始化方法的前后添加一些逻辑,这里初始化方法是指在配置文件中配置init-method,或者实现了InitializingBean接口的afterPro ...

  6. mysql常用运算符

    一.算数运算符 + 加法 - 减法 * 乘法 / 除法 % 返回余数 二.比较运算符 = 等于 <>或!= 不等于 <=> 等于(这里是安全的等于 例如: select nul ...

  7. zabbix-2.4.5的安装配置与使用

    系统最小化安装 环境: zabbix_server     12.1.1.1 zabbix_agent     12.1.1.2 zabbix_proxy      12.1.1.3 1.安装环境: ...

  8. loadrunner -vuser

    在每个负载生成器上,安装 remote agent dispatcher(process) 和 loadrunner agent 控制器指示remote agent dispatcher 在load ...

  9. APP test

    在讲APP测试之前,先讲一下,目前APP的操作系统以及APP相关基础知识. 一.APP基础知识 1.操作系统# 现在移动端的操作系统主流的分为两种:(1)安卓系统 (2)IOS系统. 2.安卓系统# ...

  10. vue表單

    使用v-model進行表單雙向數據綁定. 可以根據控件決定數據的類型,可以綁定input.單選.複選.下拉框等 可以使用number和trim等修飾符.