rpc.call方法执行的流程:(下次看代码的时候可以根据这流程来看,注意:由于rpc服务器和客户端具有很松的耦合性,因此以上步骤并不是绝对的。)

1.rpc服务器定义和启动rpc服务

2.rpc服务器建立与rabbitmq服务器的连接

3.rpc服务器创建和激活主题消费者

4.rpc客户端向主交换机发送rpc请求

5.rpc服务器接收和处理rpc请求

6.rpc客户端创建和激活直接消费者,并等待rpc响应。

目前有许多工具包实现了与rabbitmq的交互,openstack中使用的是kombu,Kombu is a messaging library for Python.(Kombu是一个针对Python的消息传递库。)

RPC call代码学习

server.py
import service

srv = service.Service()  #创建RPC服务srv.start()   1           #启动RPC服务

while True:    srv.drain_events() #监听RPC请求,这个方法的功能是用来接收和处理PRC请求,调用BrokerConnection对象的drain_events方法,用的是impl_kombu.py文件中的 self.connection = kombu.connection.BrokerConnection(**rabbit_params),但是help(kombu.connection)却找不到BrokerConnection
service.py
import rpcimport managerimport dispatcher

TOPIC = 'sendout_request'

class Service(object):    def __init__(self):        self.topic = TOPIC        self.manager = manager.Manager()

    def start(self):  2        self.conn = rpc.create_connection()  3        rpc_dispatcher = dispatcher.RpcDispatcher(self.manager)        self.conn.create_consumer(self.topic, rpc_dispatcher)        self.conn.consume()

    def drain_events(self):        self.conn.drain_events()
rpc.py
import impl_kombu

def create_connection():    return impl_kombu.Connection() 4
impl_kombu.py 这个文件实现了import kombu 接口,Kombu is a messaging library for Python.(Kombu是一个针对Python的消息传递库。)
class Connection(object):

    def __init__(self):        self.consumers = []        self.connection = None        self.reconnect()     5
def reconnect(self):     6    sleep_time = conf.get('interval_start', 1)   conf这里是字典,get的方法的作用是如果有interval_start这个值就获取出来,如果没有就用默认值1    stepping = conf.get('interval_stepping', 2)    interval_max = conf.get('interval_max', 30)    sleep_time -= stepping

    while True:        try:            self._connect()  7            return        except Exception, e:            if 'timeout' not in str(e):                raise

        sleep_time += stepping        sleep_time = min(sleep_time, interval_max)            print("AMQP Server is unreachable,"              "trying to connect %d seconds later\n" % sleep_time)        time.sleep(sleep_time)
def _connect(self):   8    hostname = rabbit_params.get('hostname')    port = rabbit_params.get('port')

    if self.connection:    #第一次调用这里是none所以会执行if外的语句        print("Reconnecting to AMQP Server on "              "%(hostname)s:%(port)d\n" % locals())        self.connection.release()        self.connection = None

    self.connection = kombu.connection.BrokerConnection(**rabbit_params)   9   **的意思是传的参是一个字典,https://www.cnblogs.com/omg-hxy/p/9081177.html 这是kombu的接口,不过用help(kombu.connection)没有找到    self.consumer_num = itertools.count(1)  # itertools.count(1) 这里会count()会创建一个无限的迭代器
    self.connection.connect()                   #这里self.connection是BrokerConnection的对象,Establish connection to server immediately.    self.channel = self.connection.channel()    #这里self.connection是channel()是BrokerConnection的对象,Create and return a new channel.
    for consumer in self.consumers:     #第一次self.consumers没有值, 所以一次返回到 7 ,5,4,3接着会执行3以后的代码,然后返回到1下面的while true        consumer.reconnect(self.channel) 

server.py

while True:
    srv.drain_events()  到这里最终调用了哪里,为什么就停止在这里了?  Wait for a single event from the server.



转载于:https://www.cnblogs.com/sosogengdongni/p/10241283.html

openstack 王者归来学习笔记相关推荐

  1. OpenStack开发学习笔记01

    OpenStack概述: openstack可以说是一个开源的操作系统. Openstack的开源协议,Apache License,是一个商业化的有好的开原协议,允许其他公司对其二次修改重新发布,来 ...

  2. 【转载】OpenStack Swift学习笔记

    免责声明:     本文转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除.     原文作者:崔炳华      原文地址:http://blog.csdn.net/i_ch ...

  3. OpenStack Swift学习笔记

    1       概述 OpenStack Object Storage(Swift)是OpenStack开源云计算项目的子项目之一.Swift的目的是使用普通硬件来构建冗余的.可扩展的分布式对象存储集 ...

  4. python王者归来—学习笔记(3)

    第三章 基本数据类型(基本数据类型.整数浮点数转换.进制数转换.常用数值计算函数-abs-power-round.字符串定义及常用操作.转义字符.str函数.chr和ord函数) 一.Python的基 ...

  5. openstack 学习笔记 虚拟机的基础安装sql glance nova keystone 。。。。。

    专业综合设计与开发 目 录 1.虚拟机的安装 6 1.1 虚拟机安装配置 6 1.2 安装epel仓库 6 1.3 克隆前的其它准备工作 6 2.Open Stack 7 2.1 OpenStack是 ...

  6. OpenStack Pike安装学习笔记

    此文原创,绝大部分资料翻译自OpenStack官方安装GUIDE,转载请注明出处. 目录 目录... 1 前言... 4 OpenStack参考架构... 4 硬件架构及配置... 5 控制器节点.. ...

  7. java Servlet学习笔记

    前言:开始学习java web了,选择一本java Web整合开发王者归来作为我的学习图书,我觉的光看是不管用的,还要把书上的代码实践一下,通过写学习笔记的形式,加快自己对于java的理解,加油. 学 ...

  8. vue学习笔记-01-前端的发展历史(从后端到前端,再到前后端分离,再到全栈)

    vue学习笔记-01-前端的发展历史(从后端到前端,再到前后端分离,再到全栈)   这篇文章是博主在看vue-前端发展简史的时候做的笔记,以供后续学习复习 文章目录 vue学习笔记-01-前端的发展历 ...

  9. Docker学习笔记 之 Docker安装配置使用

    简介 Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机).bare met ...

最新文章

  1. R语言dplyr包all_equal函数检查多个dataframe是否相同实战
  2. cordova入门——cordova环境配置
  3. jsonp跨域访问服务
  4. EventBus3.0 List事件遇到的坑
  5. 【推荐】介绍两款Windows资源管理器,Q-Dir 与 FreeCommander XE(比TotalCommander更易用的免费资源管理器)...
  6. linux虚拟机上离线安装mysql_Linux下离线安装MySQL
  7. SQL 2005数据库函数基本应用
  8. 网络服务器管理系统设置实训总结,网络系统管理与维护实训报告.doc
  9. Maven镜像地址大全,Maven镜像地址配置示例
  10. 大数据杀熟?我从银行数仓项目学到了什么
  11. 计算机硬盘电源接口,硬盘电源接口图解
  12. Java实现的一个简易网络画板
  13. idea打不开eclipse项目的问题
  14. Python爬取国家数据中心环境数据(全国城市空气质量小时报)并导入csv文件
  15. php向js的函数内传递参数-用经纬度计算2点间的距离
  16. Acoustics | 声音时间检测:日常声音理解
  17. 洛谷 P1941 飞扬的小鸟
  18. 计算机组成原理控制器的功能
  19. 【Java】统计字符出现次数
  20. access主窗体名词解释_Access 2003 常用窗体属性及其含义

热门文章

  1. linux如何将文件夹添加到书签,桌面应用|[新手技巧] 如何在Ubuntu中添加和删除书签...
  2. matlab的点平方,性能 – 有效地计算Matlab中的成对平方欧几里德距离
  3. Python基础入门的必备知识点
  4. 想知道3D游戏建模师每天都在做什么吗?3D游戏建模的那些事
  5. 年薪30万的程序员为啥找不到女朋友?这是我见过最精彩的回答!
  6. python实现使用最近最久未使用算法的请求分页存储管理_答疑(存储管理)之一...
  7. 用最简单的操作,做最精准的AI模型!
  8. 经验 | 上交机械本硕转计算机视觉岗位面经
  9. 有趣的应用 | 使用RNN预测股票价格系列一
  10. Stanley轨迹跟踪算法Python/Matlab算法实现