首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在rpyc中返回远程对象

在rpyc中返回远程对象
EN

Stack Overflow用户
提问于 2012-02-03 14:35:54
回答 1查看 5K关注 0票数 2

我有一个像下面这样的远程服务器,它已经有了一个初始化的类,并且我已经将protocol config设置为allow public attrs True。

代码语言:javascript
复制
import rpyc

class SharedClass(object):
    def __init__(self,string):
        print string

    def action(self):
        print 'i am doing something'

s=SharedClass('hi')

class MyService(rpyc.Service):
    def on_connect(self):
        pass

    def on_disconnect(self):
        pass

    def exposed_get_shared(self):
        return s

if __name__=='__main__:
    from rpyc.utils.server import ThreadedServer
    t=ThreadedServer(MyService,port=18861,protocol_config={"allow_public_attrs":True})
    t.start()

在客户端,如果我尝试直接连接,它是有效的,而当我试图在函数内部建立连接并返回对象时,我得到了一个错误

**客户端**

**专线接入**

代码语言:javascript
复制
>>>Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32
>>>Type "help", "copyright", "credits" or "license" for more information.
>>>conn=rpyc.connect('localhost',18861)
>>>share=getattr(conn.root,'get_shared')
>>>share
<bound method MyService.exposed_get_shared of <__main__.MyService
object at 0x011BA698>>
>>>share=getattr(conn.root,'get_shared')()
>>>share
<__main__.SharedClass object at 0x00B6ED30>
>>>share.action()
i am doing something

如果我试图在一个函数中这样做,我会得到一个错误;(

代码语言:javascript
复制
>>>def returnObject(objName, host, port):
...    conn = rpyc.connect(host, port)
...    print conn
...    attr = getattr(conn.root, 'get_' + objName)()
...    print attr
...    return attr
>>>share=returnObject('shared','localhost',18861)
<rpyc.core.protocol.Connection 'conn2' object at 0x0108AAD0>
<__main__.SharedClass object at 0x00B6ED30>
>>>share
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "C:\Python27\lib\site-packages\rpyc\core\netref.py", line 168,
in __repr__
   return syncreq(self, consts.HANDLE_REPR)
 File "C:\Python27\lib\site-packages\rpyc\core\netref.py", line 69,
in syncreq
   return conn().sync_request(handler, oid, *args)
AttributeError: 'NoneType' object has no attribute 'sync_request'

我的目的是在服务器中初始化一个对象,并让许多客户端访问它。初始化的类是线程安全的,因此多个客户端可以使用它。

我意识到我在这样做的时候遗漏了一些东西。

--

Adhithya

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-04 09:10:32

虽然我没有实际使用rpyc的经验,但从你的例子看,唯一真正的区别似乎是在执行returnObject函数时,“conn”引用不会被保留,所以我猜这种情况与“conn”引用的垃圾回收有关。对returnObject函数稍作修改,以便在函数外部返回并保留'conn‘,该示例似乎可以执行。

代码语言:javascript
复制
>>> import rpyc
>>> def returnObject(objName, host, port):
...     conn = rpyc.connect(host, port)
...     print conn
...     attr = getattr(conn.root, 'get_' + objName)()
...     print attr
...     return conn, attr
... 
>>> conn, share = returnObject('shared', 'localhost', 18861)
<rpyc.core.protocol.Connection 'conn1' object at 0x10b0676d0>
<__main__.SharedClass object at 0x1091ff790>
>>> share
<__main__.SharedClass object at 0x1091ff790>
>>> share.action()

由于我参与了另一个python远程对象解决方案Versile Python的开发,为了好玩,这里有一个使用该解决方案的替代实现(需要VPy开发版本0.7.2,下一个版本将有一些冲突的API更改)。提供SharedClass访问的远程服务:

代码语言:javascript
复制
from versile.quick import *
from versile.vse.native.python import VPythonObject
VSEResolver.add_imports()

class SharedClass(object):
    def action(self):
        return u'I am doing something'

shared = SharedClass()

class Gateway(VExternal):
    @publish(show=True, ctx=False)
    def get_shared(self):
        return VPythonObject(shared)

service = VTPService(lambda: Gateway(), auth=None)
service.start()

访问服务的客户端代码:

代码语言:javascript
复制
>>> from versile.quick import *
>>> VSEResolver.add_imports()
>>> gw = VUrl.resolve('vtp://localhost/')
>>> shared = gw.get_shared()
>>> shared._v_activate() # required for activating as remote-python proxy
>>> shared.action()
u'I am doing something'
>>> gw._v_link.shutdown()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9124644

复制
相关文章

相似问题

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