2015-10-07 4 views
1

i подключаюсь к клиенту с помощью RPyC и вызывает метод, открытый службой, с объектом параметра. Я хочу взять этот объект из разоблаченного метода и сделать с ним что-то, но этот объект слабо связан и в то время, когда я хочу получить доступ к его данным: я получаю ReferenceError, который сообщает мне, что объект «слабо ссылающийся объект нет дольше существует "Как изменить слабую ссылку на сильную ссылку?

Как я могу защитить объект со слабой ссылкой от сбора мусора? Как я могу изменить его, чтобы он был сильным?

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

Это не должно происходить с примитивами (ints, strings и т. Д.), Но, безусловно, может случиться с общим 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

 Смежные вопросы

  • Нет связанных вопросов^_^