Как использовать обратный вызов RPYC в другом потоке? - PullRequest
0 голосов
/ 03 октября 2019

Я пытаюсь написать класс сервера rpyc, который получает функцию обратного вызова от клиента rpyc и вызывает ее в другом потоке. У меня нет недостатка. Может кто-нибудь объяснить мне, что не так?

Вот простой концептуальный пример:

Сервер:

import rpyc
import threading
import time


class srv(rpyc.Service):

    def __init__(self):
        self.callback=None



    def on_connect(self, conn):
        print ('Connected to rpyc.')
        self.callback=None

    def on_disconnect(self, conn):

        self.callback=None
        print ('Disconnected from rpyc.')

    def exposed_set_callback(self,callback):
        self.callback=callback
        print (self.callback)
        self.callback('Callback set')

    def other_loop(self,sleep_time=1):
        while True:
            if self.callback: # want to call callback here
                print('Calling callback')
                self.callback('Hello callback')
            else:
                print('Callback is not set')
            time.sleep(sleep_time)

if __name__ == '__main__':
    server=srv()
    rpyc_server=rpyc.utils.server.ThreadedServer(server, port=18861)
    t = threading.Thread(target = rpyc_server.start)
    t1 = threading.Thread(target = server.other_loop)
    t.start()
    t1.start()
    t.join()
    t1.join()

Клиент:

import rpyc

def callback(text):
    print(text)

c = rpyc.connect("localhost", 18861)
c.root.exposed_set_callback(callback)

Вывод серверадо подключения клиента:

Callback is not set
Callback is not set
Callback is not set

Выход клиента при подключении:

Callback set

Ошибка сервера после подключения клиента:

Connected to rpyc.
<function callback at 0x000001AD3B505B70>
Calling callback
Exception in thread Thread-6:
    raise AsyncResultTimeout("result expired")
TimeoutError: result expired

Буду признателен за любую помощь. Благодарю.

...