3

RPyC を使用してクライアントに接続し、パラメーター オブジェクトを使用して Service 公開メソッドを呼び出します。公開されたメソッドからこのオブジェクトを取得して何かをしたいのですが、このオブジェクトは弱参照されており、その時点でそのデータにアクセスしたい: オブジェクトが "弱参照オブジェクトではない" ことを示す 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
4

2 に答える 2

1

これはプリミティブ (int、string など) では発生しないはずですが、一般的なオブジェクトでは発生する可能性があります。サーバーで行う必要があるの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これは、クライアント プロセスで使用することによっても実現できます。

于 2015-10-08T05:46:07.167 に答える