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 目录 ...
随机推荐
- android源码GIT下载
mkdir device cd device git clone https://android.googlesource.com/device/common.git mkdir htc cd htc ...
- windows获取窗口句柄
1.使用FindWindow函数获取窗口句柄 示例:使用FindWindow函数获取窗口句柄,然后获得窗口大小和标题,并且移动窗口到指定位置. #include <Windows.h> # ...
- UEFI GPT
其实关于UEFI的几篇文章很早就写下了,只是自己读了一遍感觉很不满意,就决定重写.目的是想用最简单直白的语言把内容写出来,让每个人都能轻松读懂.当然,如果你已经对这些内容有了很深的理解的话,这篇文章除 ...
- Fiddler的基本介绍
fiddler 简介: 一款免费且功能强大的数据包抓取软件.它通过代理的方式获取程序http通讯的数据,可以用其检测网页和服务器的交互情况,能够记录所有客户端和服务器间的http请求,支持监视.设置断 ...
- 浅谈HTTP中Get、Post、Put与Delete的区别
Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP ...
- 【转】Android异步消息处理机制完全解析,带你从源码的角度彻底理解
原文网址:http://blog.csdn.net/guolin_blog/article/details/9991569 转载请注明出处:http://blog.csdn.net/guolin_bl ...
- @Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction区别 .(转)
mvc renderaction renderpartial 杂谈 Html.RenderPartial与Html.RenderAction这两个方法都是用来在界面上嵌入用户控件的. ...
- Sping表达式语言--SpEL
Spring表达式语言---SpEL 是一个支持运行时查询和操作对象的强大的表达式语言 语法类似于EL:SpEL使用#{...}作为定界符,所有在大括号中的字符都将被认为是SpEL SpEL为bean ...
- GP(Geoprocessing)服务的发布与调用
转自:http://www.cnblogs.com/gisangela/archive/2011/01/06/1927702.html 1.什么是GP服务 GP服务是Geoprocessing服务的简 ...
- 八、jdk工具之JvisualVM、JvisualVM之一--(visualVM介绍及性能分析示例)
目录 一.jdk工具之jps(JVM Process Status Tools)命令使用 二.jdk命令之javah命令(C Header and Stub File Generator) 三.jdk ...