Редактировать: после обсуждения этого с некоторыми друзьями-программистами мы предполагаем, что это может быть проблемой с RPy C. Я открыл проблему на их странице git.
У меня есть два типа служб, я подключаюсь к одной службе, используя другую службу для ответов, как описано в RPy C руководство. Но по какой-то причине я получаю тайм-аут при попытке использовать службу ответа.
Я пробовал это в нескольких местах кода, думая, что, возможно, интроспекция делает вещи go haywire, но без кубиков.
Понятия не имею, почему это истекло. Я воспроизвел проблему в простейшей форме, какую только мог.
код:
import rpyc, sys, threading, time, socket, random
from rpyc.utils.server import ThreadedServer
from rpyc.utils.helpers import classpartial
from threading import Lock
import os, inspect
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
parentdir = os.path.dirname(currentdir)
sys.path.insert(0,parentdir)
from dag import DAG
import logging
import copy
RPYC_CFG = {"allow_all_attrs": True, "allow_pickle": True}
logging.basicConfig(
format='%(asctime)s %(levelname)-8s %(message)s',
level=logging.DEBUG, filename="log.txt",
datefmt='%Y-%m-%d %H:%M:%S')
class netAddr:
def __init__(self, host, mport):
self.host = host
self.mport = mport
class NodeManagerService(rpyc.Service):
def __init__(self, node):
self.node = node
def on_connect(self, conn):
self.node.manager = conn
#don't work either:
#conn.root.foo("bar0")
#self.node.manager.root.foo("bar1")
class Node:
def __init__(self, addr):
self.manager_thread = ThreadedServer(classpartial(NodeManagerService, self), hostname=addr.host, port=addr.mport, protocol_config=RPYC_CFG)
threading.Thread(target=self.manager_thread.start).start()
class ManagerService(rpyc.Service):
def exposed_foo(self, foo):
logging.debug("manager got " + str(foo))
return
class Manager:
def __init__(self, addr):
self.node = rpyc.connect(addr.host, addr.mport, service = ManagerService, config=RPYC_CFG)
if __name__ == "__main__":
addr = netAddr("localhost", 10000)
n = Node(addr)
m = Manager(addr)
time.sleep(0.1) #give the node and manager some time to get acquainted
n.manager.root.foo("bar2")
вывод журнала:
2020-03-29 18:03:29 INFO server started on [127.0.0.1]:10000
2020-03-29 18:03:29 INFO accepted ('127.0.0.1', 53007) with fd 756
2020-03-29 18:03:29 INFO welcome ('127.0.0.1', 53007)
вывод консоли:
Traceback (most recent call last):
File "c:/Users/ShaiDeshe/dev/pocs/ghostdag/netsim/isolated.py", line 54, in <module>
n.manager.root.foo("bar2")
File "C:\Users\ShaiDeshe\AppData\Local\Programs\Python\Python38-32\lib\site-packages\rpyc\core\protocol.py", line 502, in root
self._remote_root = self.sync_request(consts.HANDLE_GETROOT)
File "C:\Users\ShaiDeshe\AppData\Local\Programs\Python\Python38-32\lib\site-packages\rpyc\core\protocol.py", line 469, in sync_request
return self.async_request(handler, *args, timeout=timeout).value
File "C:\Users\ShaiDeshe\AppData\Local\Programs\Python\Python38-32\lib\site-packages\rpyc\core\async_.py", line 100, in value
self.wait()
File "C:\Users\ShaiDeshe\AppData\Local\Programs\Python\Python38-32\lib\site-packages\rpyc\core\async_.py", line 49, in wait
raise AsyncResultTimeout("result expired")
TimeoutError: result expired