2012-02-03 9 views
2

私は以下のような初期化されたクラスを持っているリモートサーバを持っています。私はallow public attrsとしてプロトコル設定をtrueに設定しています。クライアント側では rpycのリモートオブジェクトを返す

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() 

私は私がエラーに

**クライアントを取得しています関数内で接続を行うと、オブジェクト を返すようにしようとすると のに対し、それが働いている直接接続しようとした場合

* *

**直接接続**

>>>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 

私はエラーを取得しています機能でそれを実行しようとした場合、(

>>>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

答えて

2

私はあなたの例から、rpycとの本当の経験を持っていませんが、唯一の本当の違いがでCONN "参照が保持されませんreturnObjectを実行するときに機能しているようですので、私状況を推測しているのは、 'conn'によって参照されているもののガベージコレクションと関係しています。 returnObject関数をわずかに変更して、 'conn'を返して関数の外に保持すると、この例は実行されたようです。ここだけの楽しみのため

>>> 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の開発に携わっていたように、その溶液を使用して代替実装である(次のバージョンは、いくつかの矛盾APIの変更を持って、VPYは0.7.2をリリースDEVが必要です)。 SharedClassアクセスを提供するリモートサービス:サービスにアクセスするための

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() 

クライアントコード:

>>> 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() 
+0

私はconnおよびATTR返す場合は、私のコードは動作しています。ご協力いただきありがとうございます。 – Adhithya

関連する問題