Twisted中透明代理简介

透明代理(PB, Perspective Broker)是用于远程方法调用和对象交换协议,该协议是异步和对称的。使用PB, 客户端可以直接调用服务器的函数并得到函数的返回结果。
    Twisted针对Server和Client分别提供了pb.PBServerFactory和pb.PBClientFactory供用户使用, 其中Factory中的root对象必须继承自pb.Referenceable(pb.root就继承自pb.Referenceable)。 Sevrer中提供的方法必须以remote_开头 Client使用该方法时不用指定remote。 例如下面的例子中服务器端提供了remote_echo方法,客户端使用callRemote("echo", "hi")即可调用该方法。

服务器端:
from twisted.spread import pb
from twisted.internet import reactor

class Echoer(pb.Root):
    def remote_echo(self, st):  //Server中提供的方法必须以remote_开头
        print 'hi'
        return st

    def remote_test(self):
        return self

if __name__ == '__main__':
    reactor.listenTCP(8003, pb.PBServerFactory(Echoer()))   //Echoer继承于pb.Root
    reactor.run()

 

pb.PBServerFactory的构造函数如下:
def __init__(self, root, unsafeTracebacks=False, security=globalSecurity): (source)
Parameters root factory providing the root Referenceable used by the broker. (type: object providing or adaptable to IPBRoot. )
  unsafeTracebacks if set, tracebacks for exceptions will be sent over the wire. (type: bool )
  security security options used by the broker, default to globalSecurity. (type: twisted.spread.jelly.SecurityOptions )

 

 

 

 

客户端:
from twisted.spread import pb
from twisted.internet import reactor
from twisted.python import util

factory = pb.PBClientFactory()
reactor.connectTCP('127.0.0.1', 8003, factory)
d = factory.getRootObject()
d.addCallback(lambda object: object.callRemote("echo", "hi"))  //客户端使用callRemote("echo", "hi")即可调用服务段的remote_echo()方法,并将"hi"作为参数传入。
d.addCallback(lambda result: result)
d.addErrback(lambda reason: 'error: ' + str(reason.value))
d.addCallback(util.println)
d.addCallback(lambda _: reactor.stop())
reactor.run()

    远程方法调用除了可以返回和传递字符串、词典、列表等简单对象外,还可以传递pb.Referenceable对象。象上面的例子中,可以先调用callRemote("test")来获得一个新的pb.Referenceable对象,然后在对该对象使用callRemote方法。

 

 

def callRemote(self, _name, *args, **kw): (source)
Asynchronously invoke a remote method.  (异步调用远程方法)
Parameters _name the name of the remote method to invoke (type: string )   (远程方法要调用的名字)
  args arguments to serialize for the remote function  元组参数
  kw keyword arguments to serialize for the remote function. 字典参数
Returns a Deferred which will be fired when the result of this remote call is received. (type: twisted.internet.defer.Deferred )

你可能感兴趣的:(简介)