pythoncast函数用法_python 64式: 第1式 编写rpc的call和cast

myserver.py内容如下#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 6/8/17 12:15 PM # @Author : Aries # @Site : # @File : myserver.py # @Software: PyCharm from oslo_config import cfg import oslo_messaging as messaging ''' 参考: 关键: 1 Target含义 Target封装了指定某一个消息最终目的地的所有信息,下表所示为其所具有的属 namespace = None(字符串类型)用来标识服务器所暴露的某个特定接口 (多个可被远程调用的方法) version = None(字符串类型)服务器所暴露的接口支持M.N类型的版本号.次版本号(N)的增加表示新的接口向前兼容, 主版本号(M)的增加表示新接口和旧接口不兼容.RPC服务器可以实现多个不同的主版本号接口. 2 Transport含义 用户可以通过oslo.messaging.get_transport来获得transport对象实例的句柄 从cfg对象中读取transport_url,rpc_backend,control_exchange信息来构造 Transport对象,其中rpc_backend默认值: rabbit control_exchange默认值:openstack 3 Target的初始化 用户可以通过oslo.messaging.get_transport来获得transport对象实例的句柄 构造服务器的target时候,需要topic和server参数,exchange参数可以选择 4 get_rpc_server()方法 这里使用get_rpc_server()函数创建server对象,然后调用server对象的start方法 开始接收远程调用.get_rpc_server()函数的参数如下表所求: endpoints(列表类型)包含了endpoints对象实例的列表 blocking:在这种方式中,用户调用start函数后,在start函数中开始请求处理循环:用户线程阻塞,处理下一个请求.直到用户调用了stop 函数后,这个处理循环才会退出.消息的接收和分发处理都在调用start函数的线程中完成. 构造RPC-server对象,其中executor有两种方式: blocking和evenlet blocking:调用start函数后,用户线程阻塞,知道调用stop函数。 处理循环退出 eventlet:协程GreenThread处理消息的接受,然后有其他不同GreenThread处理不同消息分发 处理,不会被阻塞 ''' class RpcCastEndpoint(object): target = messaging.Target(namespace='control',version='2.0') def __init__(self): pass def processCast(self, ctx, name): # print "####### RpcCastEndpoint.processCast##########" print name class RpcCallEndpoint(object): def __init__(self): pass def processCall(self, ctx, name): # print "####### RpcCallEndpoint.processCall" print name return name def startRpcServer(): transport = messaging.get_transport(cfg.CONF) target = messaging.Target(topic='test', server='server1') endpoints = [ RpcCastEndpoint(), RpcCallEndpoint(), ] server = messaging.get_rpc_server(transport, target, endpoints, executor='blocking') server.start() server.wait() def process(): startRpcServer() if __name__ == "__main__": process()

myclient.py内容如下#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 6/8/17 12:15 PM # @Author : Aries # @Site : # @File : myclient.py # @Software: PyCharm ''' 参考文章: http://blog.csdn.net/happyanger6/article/details/54777429 https://docs.openstack.org/oslo.messaging/ocata/rpcclient.html 关键: 1 RPC Client基础 oslo_messaging.RPCClient(transport, target, timeout=None,, version_cap=None, serializer=None, retry=None) 作用:调用远程RPC服务的类 参数: transport: rpc底层通信,支持rabbit,qpid target: 消息最终发送的地方 形式:target(exchange,topic,server): 参数:exchange:topic属于的范围,默认为配置文件的control_exchange topic: 可被远程调用的多个方法 server:消息目的地服务器 2 RPC Call方法 oslo_messaging.RPCClient.call(ctxt, method, **kwargs) 含义:call方法是远程过程调用带有返回值的方法 特点:阻塞直到服务端返回结果 参数: ctxt:上下文字典,可为空 method:被调用的方法名 kwargs:调用该方法传入的参数 返回值:返回被调用远程方法的结果 3 RPC Cast方法 oslo_messaging.RPCClient.cast(ctxt, method, **kwargs) 含义:cast方法是远程过程调用,不带有返回值的方法 参数: ctxt:上下文字典,可为空 method:被调用的方法名 kwargs:调用该方法传入的参数 返回值:无 4 RPC总结: 实际就是一个远程调用,客户端通过rpc调用服务端的方法。 通过指定方法名和对应参数来进行调用; 客户端和服务端通过Target进行连接,都需要指明topic参数。 ''' from oslo_config import cfg import oslo_messaging as messaging def rpcCall(): # 消息中间件,rabbitMQ或者Qpid等 transport = messaging.get_transport(cfg.CONF) target = messaging.Target(topic='test') client = messaging.RPCClient(transport, target) ret = client.call(ctxt={}, method='processCall', name='hello rpc call') print "######## End call, result: %s" % ret def rpcCast(): transport = messaging.get_transport(cfg.CONF) target = messaging.Target(topic='test') client = messaging.RPCClient(transport, target) cctx = client.prepare(namespace='control', version='2.0') cctx.cast({}, 'processCast', name='hello rpc cast') print "######## End cast" def process(): rpcCall() rpcCast() if __name__ == "__main__": process()

先执行:

python myserver.py

然后执行

python myclient.py

即可显示最终结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值