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 rpc
import manager
import 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.


												

openstack 王者归来学习笔记的更多相关文章

  1. JavaWeb王者归来学习笔记

    JavaWeb王者归来学习笔记... Ajax王者归来: Ajax:Asynchronous JavaScript And XML -------Ajax 是一些旧有技术的结合.但却以一种新的姿态.披 ...

  2. Openstack本学习笔记——Neutron-server服务加载和启动源代码分析(三)

    本文是在学习Openstack过程中整理和总结.因为时间和个人能力有限.错误之处在所难免,欢迎指正! 在Neutron-server服务载入与启动源代码分析(二)中搞定模块功能的扩展和载入.我们就回到 ...

  3. Openstack swift 学习笔记

    Swift 不是文件系统或者实时的数据存储系统,而是对象存储,用于长期存储永久类型的静态数据.这些数据可以检索.调整和必要时进行更新.Swift最适合虚拟机镜像.图片.邮件和存档备份这类数据的存储. ...

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

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

  5. openstack学习笔记一 虚拟机启动过程代码跟踪

    openstack学习笔记一 虚拟机启动过程代码跟踪 本文主要通过对虚拟机创建过程的代码跟踪.观察虚拟机启动任务状态的变化,来透彻理解openstack各组件之间的作用过程. 当从horizon界面发 ...

  6. 关于OpenStack的学习路线及相关资源汇总

    首先我们想学习openstack,那么openstack是什么?能干什么?涉及的初衷是什么?由什么来组成?刚接触openstack,说openstack不是一个软件,而是由多个组件进行组合,这是一个更 ...

  7. Go语言学习笔记四: 运算符

    Go语言学习笔记四: 运算符 这章知识好无聊呀,本来想跨过去,但没准有初学者要学,还是写写吧. 运算符种类 与你预期的一样,Go的特点就是啥都有,爱用哪个用哪个,所以市面上的运算符基本都有. 算术运算 ...

  8. eventlet学习笔记

    eventlet学习笔记 标签(空格分隔): python eventlet eventlet是一个用来处理和网络相关的python库函数,且可以通过协程(coroutines)实现并发.在event ...

  9. Puppet学习笔记(CentOS6.3+Puppet3.01)

    Puppet学习笔记(CentOS6.3+Puppet3.01)  技术 Add comments Oct262012 下了决心,好好学习puppet,周末专门去参加一个puppet的培训,难得朋友那 ...

随机推荐

  1. PyQt5实现邮件合并功能(GUI)

    1. 实战Word批量 需要处理批量替换word的一些数据,数据源从Excel中来. Excel的百分数会变为数字,以及浮点数会多好多精度,为了原汁原味的数据,直接复制数据到文本文件.通过\t来分隔即 ...

  2. 74.纯 CSS 创作一台 MacBook Pro

    原文地址:https://segmentfault.com/a/1190000015568609 HTML code: <div class="macbook"> &l ...

  3. web 安全:

    XSSXSS 全称“跨站脚本”,是注入攻击的一种. 其特点是不对服务器端造成任何伤害,而是通过一些正常的站内交互途径,例如发布评论,提交含有 JavaScript 的内容文本. 这时服务器端如果没有过 ...

  4. django全流程--青空琉璃

    @python相关 1.多线程与多进程 https://zhuanlan.zhihu.com/p/45828888 2.用日志logging模块取代print() https://blog.csdn. ...

  5. Android Jetpack 组建介绍(一)——Lifecycler

    转自带你领略Android Jetpack组件的魅力 Android Jetpack 对于任何一个产品来说,我们开发中都会面对哪些问题?如:产品交互.用户体验.代码结构.数据获取.数据存储.网络优化. ...

  6. redis hashmap数据结构分析

    说明一点:redis的hash中每一个key都是一个单独的hash表,field是hash表中的key,value是hash表中的value: //redis中hash数据结构为:key-field- ...

  7. arcgis point 随着 line类型的轨迹运动的动画

    animate : function(frampoint,topoint,speed = 60){ var path = topoint.geometry.paths[0]; var i = 1; v ...

  8. SQLServer与MySQL约束/索引命名的一些差异总结

    约束是数据库完整性的保证,主要分为:主键/外键/唯一键/默认值/check等类别,约束是一个逻辑概念,表示数据的某些特性(不能为空,唯一,必须满足某些条件等等),索引是一个逻辑与物理概念的结合,逻辑上 ...

  9. linux 之用户管理

    用户的家目录 普通用户:/home/用户名/,所有者和所属组都是此用户,权限是700 超级用户:/root/,所有者和所属组都是root用户,权限是550 用户邮箱目录 /var/spool/mail ...

  10. 聊聊 HashMap

    数据存储底层? 数据底层具体存储是一个Node<K,V> HashMap 是基于哈希来映射的,那当映射冲突时候怎么解决? 链地址,数组+链表 HashMap 什么时候扩容? 负载因子 lo ...