Тайм-аут при попытке использовать RPy C развязку - PullRequest
0 голосов
/ 29 марта 2020

Редактировать: после обсуждения этого с некоторыми друзьями-программистами мы предполагаем, что это может быть проблемой с 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
...