2015-10-07 50 views
1

我使用RPyC連接到客戶端,並使用參數對象調用服務公開方法。我想從暴露的方法中獲取這個對象,並用它做一些事情,但是這個對象是弱引用的,並且當時我想訪問它的數據:我得到一個ReferenceError,它告訴我對象「弱引用對象no更長的存在「如何將弱引用改爲強引用?

我怎樣才能安全的垃圾收集弱引用的對象?我怎樣才能改變它是強引用?

server.py(發送消息)

conn = rpyc.connect(ip,port) 
bgsrv = rpyc.BgServingThread(conn) 
conn.root.my_remote_method(a, b, c) # a,b,c are integer, strings etc. 
time.sleep(0.2) 
bgsrv.stop() 
conn.close() 

client.py(處理數據並將其放入一個隊列)

class MessageService(Service): 
    def exposed_my_remote_method(self, a, b, c): 
     ThreadedClient.queue.put([a,b,c]) 

other.py(讀取隊列)

def read_queue(self): 
    """ Handle all the messages currently in the queue (if any) """ 
    while ThreadedClient.queue.qsize(): 
     try: 
      msg = ThreadedClient.queue.get(0) 
      self.read_message(msg) 
     except Queue.Empty: 
      pass 

def read_message(self, msg): 
    # do something with the data of a, b, c 
    res = msg[0] + xy # ReferenceError 

回答

1

這不應該發生在基元(int,字符串等),但肯定會發生與一般obj學分。你需要在服務器上執行的是obtain對象,這些對象在服務器進程中創建它們的副本,而不再取決於要保存在客戶端進程中的引用。

class MessageService(Service): 
    def exposed_my_remote_method(self, a, b, c): 
     a,b,c = rpyc.classic.obtain([a,b,c]) 
     ThreadedClient.queue.put([a,b,c]) 

這也可以通過在客戶端進程中使用deliver來實現。

+1

添加這些行後,我得到了另一個錯誤:「ValueError:酸洗被禁用」。我在[question26899050](http://stackoverflow.com/questions/26899050/multiprocessing-python-with-rpyc-valueerror-pickling-is-disabled)找到了解決這個問題的方法,即添加'conn = rpyc.connect (ip,port,config = {「allow_public_attrs」:True,「allow_pickle」:True})' – Paula