首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扭曲:如何使用Perspective发送和接收相同的对象?

扭曲:如何使用Perspective发送和接收相同的对象?
EN

Stack Overflow用户
提问于 2012-01-25 15:49:05
回答 1查看 1.2K关注 0票数 0

我有一个简单的' echo‘PB客户机和服务器,其中客户端向服务器发送一个对象,该服务器将同一个对象回显回客户机:

客户:

代码语言:javascript
复制
from twisted.spread import pb
from twisted.internet import reactor
from twisted.python import util
from amodule import aClass

factory = pb.PBClientFactory()
reactor.connectTCP("localhost", 8282, factory)
d = factory.getRootObject()

d.addCallback(lambda object: object.callRemote("echo", aClass()))
d.addCallback(lambda response: 'server echoed: '+response)
d.addErrback(lambda reason: 'error: '+str(reason.value))
d.addCallback(util.println)

d.addCallback(lambda _: reactor.stop())
reactor.run()

服务器:

代码语言:javascript
复制
from twisted.application import internet, service
from twisted.internet import protocol
from twisted.spread import pb
from amodule import aClass

class RemoteClass(pb.RemoteCopy, aClass):
    pass
pb.setUnjellyableForClass(aClass, RemoteClass)

class PBServer(pb.Root):
    def remote_echo(self, a):
        return a

application = service.Application("Test app")

# Prepare managers
clientManager = internet.TCPServer(8282, pb.PBServerFactory(PBServer()));
clientManager.setServiceParent(application)

if __name__ == '__main__':
    print "Run with twistd"
    import sys
    sys.exit(1)

aClass是一个实现可复制的简单类:来自twisted.spread导入pb

代码语言:javascript
复制
class aClass(pb.Copyable):
    pass

当我运行上面的代码时,我得到了以下错误: twisted.spread.jelly.InsecureJelly:内置是不允许的(类型为)

实际上,对象被发送到服务器时没有任何问题,因为它在服务器端使用pb.setUnjellyableForClass(aClass,RemoteClass)进行了安全保护,但是一旦返回到客户端,就会引发错误。

我正在寻找一种在两个对等点之间发送/接收我的对象的简单方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-25 16:07:44

透视图代理在通过网络讨论类时按名称标识类。类的名称部分来自定义它的模块。在从命令行运行的文件中定义类(即“主脚本”)的一个棘手问题是,它们可能以一个令人惊讶的名称结束。当你这样做时:

代码语言:javascript
复制
python foo.py

Python给foo.py中的代码取的模块名并不像人们所期望的那样是"foo"。相反,它类似于"__main__" (这就是为什么if __name__ == "__main__":技巧奏效的原因)。

但是,如果您的应用程序的其他部分稍后尝试从foo.py导入某些内容,那么Python将重新评估的内容,以创建一个名为"foo"的新模块。

此外,在一个进程的"__main__"模块中定义的类可能与另一个进程的"__main__"模块中定义的类无关。在您的示例中,__main__.RemoteClass是在服务器进程中定义的,但是客户端进程的__main__模块中没有RemoteClass

因此,PB被混淆了,无法完成对象的传输。

解决方案是尽量减少主脚本中的代码数量,特别是不要用名称(没有类,没有函数定义)来定义东西。

然而,另一个问题是期望一个RemoteCopy可以在PB上发送而不需要额外的准备。可以发送Copyable,在对等点上创建RemoteCopy,但这不是对称关系。您的客户端还需要通过发出类似(或不同)的pb.setUnjellyableForClass调用来允许这一点。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9005615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档