这些天断断续续在看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远程调用协议的更多相关文章

  1. 【转】Python中实现远程调用(RPC、RMI)简单例子

    远程调用使得调用远程服务器的对象.方法的方式就和调用本地对象.方法的方式差不多,因为我们通过网络编程把这些都隐藏起来了.远程调用是分布式系统的基础. 远程调用一般分为两种,远程过程调用(RPC)和远程 ...

  2. Python中实现远程调用(RPC、RMI)简单例子

    说白了,远程调用就是将对象名.函数名.参数等传递给远程服务器,服务器将处理结果返回给客户端   远程调用使得调用远程服务器的对象.方法的方式就和调用本地对象.方法的方式差不多,因为我们通过网络编程把这 ...

  3. Java中RMI远程调用demo

    Java远程方法调用,即Java RMI(Java Remote Method Invocation),一种用于实现远程过程调用的应用程序编程接口.它使客户机上运行的程序可以调用远程服务器上的对象.远 ...

  4. php中curl远程调用获取数据

    $jump_url=$this->_post('locations'); $url=htmlspecialchars_decode($jump_url); $ch = curl_init(); ...

  5. java项目中rmi远程调用实例

    1.创建一个学生实体类Student.java: package com.RMIdemo.entity; @SuppressWarnings("serial") public cl ...

  6. 架构师之路-在Dubbo中开发REST风格的远程调用

    架构师之路:从无到有搭建中小型互联网公司后台服务架构与运维架构 http://www.roncoo.com/course/view/ae1dbb70496349d3a8899b6c68f7d10b 概 ...

  7. 【Rest】在Dubbo中开发REST风格的远程调用(RESTful Remoting)

    目录 概述 REST的优点 应用场景 快速入门 标准Java REST API:JAX-RS简介 REST服务提供端详解 HTTP POST/GET的实现 Annotation放在接口类还是实现类 J ...

  8. gdb调试原理及qemu中的gdbserver

    (一)gdb调试原理 此部分转自:https://blog.csdn.net/u012658346/article/details/51159971     https://www.cnblogs.c ...

  9. node 模块载入原理【1】

    简单介绍 我们会从简单的模块载入原理来开始,尝试阅读下 Node.js 源代码.首先我们知道 Node.js 的源代码主要是由 C++ 和 JavaScript 编写的,JS 部分主要在 lib 目录 ...

随机推荐

  1. sencha touch tabsidebar 源码扩展

    先上图看效果 没错,这是一个sencha touch 项目,而这里的右边推出效果(下文叫做tabsiderbar),使用插件tabsiderbar来扩展的. 插件js下载地址:http://www.m ...

  2. SGU 438 The Glorious Karlutka River =) ★(动态+分层网络流)

    [题意]有一条东西向流淌的河,宽为W,河中有N块石头,每块石头的坐标(Xi, Yi)和最大承受人数Ci已知.现在有M个游客在河的南岸,他们想穿越这条河流,但是每个人每次最远只能跳D米,每跳一次耗时1秒 ...

  3. 正则化(Regularization)

    正则化(Regularization)是机器学习中抑制过拟合问题的常用算法,常用的正则化方法是在损失函数(Cost Function)中添加一个系数的\(l1 - norm\)或\(l2 - norm ...

  4. Zabbix探索:使用msmtp进行邮件告警

    在Nagios时代就已经使用msmtp发送告警了,不过那时候偷懒,使用mutt发送来简化格式. 在Zabbix时代,更多人使用msmtp,所以官方论坛上有个zext_msmtp.sh的脚本,但是不要以 ...

  5. Python 同时for遍历多个列表

    a = range(3) b = range(3) [ (x, y) for x, y in zip(a, b) ] 结果: [ (0,0), (1,1), (2,2) ] 当然,如上可以推广到多个列 ...

  6. 细谈Linux和windows差异之图形化用户接口、命令行接口

    相信来看本博文的朋友,肯定是已经玩过linux好段时间了,才能深刻理解我此番话语. 这是在Windows下的命令行接口 这是windows下的用户接口 就是它,explorer.ext,可以去尝试.把 ...

  7. Spark生态之SparkR

  8. css div 不能贴边

    *{margin:0;padding:0} 在css 最前加上这句,取消所有内边距和外边距.

  9. PC问题-使用BAT方法清理Delphi临时文件

    @echo offdel /S *.~*del /S *.dcudel /S *.dskdel /S *.hppdel /S *.ddpdel /S *.mpsdel /S *.mptdel /S * ...

  10. iOS CAShapeLayer精讲

    前言 CAShapeLayer继承自CALayer,因此,可使用CALayer的所有属性.但是,CAShapeLayer需要和贝塞尔曲线配合使用才有意义. 关于UIBezierPath,请阅读文章:i ...