Firefly distributed模块的原理与twisted中PB远程调用协议
这些天断断续续在看Firefly, 看了一下distributed模块的设计,其实就是使用的twisted.spread.pb
觉得以后要是想用Firefly有必要了解一下twisted, 所以在网上查了一下资料,更好的资料莫过于官方资料了,官方的例子挺多的,我挑了这一个例子:
这里给个官方的例子:
server:
from twisted.spread import pb
# 这里使用Referenceable是可以通过远程调用获得此对象
class Two(pb.Referenceable):
# remote_前缀是twisted要求的规范, Server中提供的方法必须以remote_开头
def remote_three(self, arg):
print "Two.three was given", arg
# Factory中的Root对象必须继承自pb.Referenceable
# pb.Root就继承自pb.Referenceable
class One(pb.Root):
def remote_getTwo(self):
two = Two()
print "returning a Two called", two
return two
from twisted.internet import reactor
reactor.listenTCP(8800, pb.PBServerFactory(One()))
reactor.run()
client:
from twisted.spread import pb
from twisted.internet import reactor
def main():
factory = pb.PBClientFactory()
reactor.connectTCP("localhost", 8800, factory)
# getRootObject返回的是一个Deferred实例
def1 = factory.getRootObject()
# 添加callback处理函数got_obj1,如果出错则执行err_obj1
#
def1.addCallbacks(got_obj1, err_obj1)
reactor.run()
def err_obj1(reason):
print "error getting first object", reason
reactor.stop()
def got_obj1(obj1):
print "got first object:", obj1
print "asking it to getTwo"
# Deferred通过callRemote调用远程对象,返回的还是个Deferred
def2 = obj1.callRemote("getTwo")
# 给Deferred添加返回处理函数
def2.addCallbacks(got_obj2)
def got_obj2(obj2):
print "got second object:", obj2
print "telling it to do three(12)"
obj2.callRemote("three", 12)
main()
Twisted针对Server和Client分别提供了pb.PBServerFactory和pb.PBClientFactory供用户使用.所以我们很方便就可以建立通讯。这里我们不论是我们getRootObject还是callRemote返回的都是Deferred对象, twisted使用Deferred对象管理callback系列。
远程方法调用除了可以返回和传递字符串、词典、列表等简单对象外,还可以传递pb.Referenceable对象。上面的例了中callRemote("getTwo")调用remote_getTwo,返回的是Two的实例,是一个pb.Referenceable对象。接着可以在callback中再次调用callRemote("three")调用remote_three。
如果需要的户客端获取返回的数据,比如返回的列表则可以这样做:
class Two(pb.Referenceable):
def remote_three(self, arg):
print "Two.three was given", arg
return [1,2,3]
这里还是用上面的代码,只是在three中添加一个返回,为了获取最后返回的这个列表,则需要为callRemote("three", 12)添加一个callback:
def got_obj2(obj2):
print "got second object:", obj2
print "telling it to do three(12)"
obj2.callRemote("three", 12).addCallbacks(test)
def test(obj):
print obj
些处添加了一个test函数处理callRemote("three", 12)返回的数据,传递的obj就是返回的[1,2,3]。
大部份都写在注释里了,写得很乱,但也是我学twisted的一点心得 ^_^
参考:
cnblogs.com/zhangjing0502/archive/2012/05/16/2504415.html
Firefly distributed模块的原理与twisted中PB远程调用协议的更多相关文章
- 【转】Python中实现远程调用(RPC、RMI)简单例子
远程调用使得调用远程服务器的对象.方法的方式就和调用本地对象.方法的方式差不多,因为我们通过网络编程把这些都隐藏起来了.远程调用是分布式系统的基础. 远程调用一般分为两种,远程过程调用(RPC)和远程 ...
- Python中实现远程调用(RPC、RMI)简单例子
说白了,远程调用就是将对象名.函数名.参数等传递给远程服务器,服务器将处理结果返回给客户端 远程调用使得调用远程服务器的对象.方法的方式就和调用本地对象.方法的方式差不多,因为我们通过网络编程把这 ...
- Java中RMI远程调用demo
Java远程方法调用,即Java RMI(Java Remote Method Invocation),一种用于实现远程过程调用的应用程序编程接口.它使客户机上运行的程序可以调用远程服务器上的对象.远 ...
- php中curl远程调用获取数据
$jump_url=$this->_post('locations'); $url=htmlspecialchars_decode($jump_url); $ch = curl_init(); ...
- java项目中rmi远程调用实例
1.创建一个学生实体类Student.java: package com.RMIdemo.entity; @SuppressWarnings("serial") public cl ...
- 架构师之路-在Dubbo中开发REST风格的远程调用
架构师之路:从无到有搭建中小型互联网公司后台服务架构与运维架构 http://www.roncoo.com/course/view/ae1dbb70496349d3a8899b6c68f7d10b 概 ...
- 【Rest】在Dubbo中开发REST风格的远程调用(RESTful Remoting)
目录 概述 REST的优点 应用场景 快速入门 标准Java REST API:JAX-RS简介 REST服务提供端详解 HTTP POST/GET的实现 Annotation放在接口类还是实现类 J ...
- gdb调试原理及qemu中的gdbserver
(一)gdb调试原理 此部分转自:https://blog.csdn.net/u012658346/article/details/51159971 https://www.cnblogs.c ...
- node 模块载入原理【1】
简单介绍 我们会从简单的模块载入原理来开始,尝试阅读下 Node.js 源代码.首先我们知道 Node.js 的源代码主要是由 C++ 和 JavaScript 编写的,JS 部分主要在 lib 目录 ...
随机推荐
- sencha touch tabsidebar 源码扩展
先上图看效果 没错,这是一个sencha touch 项目,而这里的右边推出效果(下文叫做tabsiderbar),使用插件tabsiderbar来扩展的. 插件js下载地址:http://www.m ...
- SGU 438 The Glorious Karlutka River =) ★(动态+分层网络流)
[题意]有一条东西向流淌的河,宽为W,河中有N块石头,每块石头的坐标(Xi, Yi)和最大承受人数Ci已知.现在有M个游客在河的南岸,他们想穿越这条河流,但是每个人每次最远只能跳D米,每跳一次耗时1秒 ...
- 正则化(Regularization)
正则化(Regularization)是机器学习中抑制过拟合问题的常用算法,常用的正则化方法是在损失函数(Cost Function)中添加一个系数的\(l1 - norm\)或\(l2 - norm ...
- Zabbix探索:使用msmtp进行邮件告警
在Nagios时代就已经使用msmtp发送告警了,不过那时候偷懒,使用mutt发送来简化格式. 在Zabbix时代,更多人使用msmtp,所以官方论坛上有个zext_msmtp.sh的脚本,但是不要以 ...
- Python 同时for遍历多个列表
a = range(3) b = range(3) [ (x, y) for x, y in zip(a, b) ] 结果: [ (0,0), (1,1), (2,2) ] 当然,如上可以推广到多个列 ...
- 细谈Linux和windows差异之图形化用户接口、命令行接口
相信来看本博文的朋友,肯定是已经玩过linux好段时间了,才能深刻理解我此番话语. 这是在Windows下的命令行接口 这是windows下的用户接口 就是它,explorer.ext,可以去尝试.把 ...
- Spark生态之SparkR
- css div 不能贴边
*{margin:0;padding:0} 在css 最前加上这句,取消所有内边距和外边距.
- PC问题-使用BAT方法清理Delphi临时文件
@echo offdel /S *.~*del /S *.dcudel /S *.dskdel /S *.hppdel /S *.ddpdel /S *.mpsdel /S *.mptdel /S * ...
- iOS CAShapeLayer精讲
前言 CAShapeLayer继承自CALayer,因此,可使用CALayer的所有属性.但是,CAShapeLayer需要和贝塞尔曲线配合使用才有意义. 关于UIBezierPath,请阅读文章:i ...