Skip to content

Commit ac99ff7

Browse files
committed
Switch from Pyro5 to rpyc
1 parent 67ec04f commit ac99ff7

File tree

2 files changed

+32
-76
lines changed

2 files changed

+32
-76
lines changed

setup.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from setuptools import setup, find_packages
22

3-
VERSION = '1.0.5'
3+
VERSION = '2.0.0'
44
DESCRIPTION = 'Base for StreamController plugins'
55
LONG_DESCRIPTION = 'This package contains the base for StreamController plugins.'
66

@@ -14,7 +14,7 @@
1414
description=DESCRIPTION,
1515
long_description=LONG_DESCRIPTION,
1616
packages=find_packages(),
17-
install_requires=["Pyro5", "loguru"],
17+
install_requires=["rpyc", "loguru"],
1818
keywords=['python', 'StreamController', "plugin"],
1919
classifiers= [
2020
"Development Status :: 4 - Beta",
Lines changed: 30 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,96 +1,52 @@
11
import argparse
2-
import Pyro5.api
32
import threading
4-
import time
53
import sys
6-
import os
74
from loguru import logger as log
85

96
log.remove(0)
107
log.add(sys.stderr, level="TRACE")
118

12-
@Pyro5.api.expose
13-
class BackendBase:
9+
import rpyc
10+
from rpyc.utils.server import ThreadedServer
11+
from rpyc.core.protocol import Connection
12+
import argparse
13+
14+
class BackendBase(rpyc.Service):
1415
def __init__(self):
15-
self.daemon:Pyro5.api.Daemon = None
16-
log.trace("Init Pyro...")
17-
self.init_pyro5()
18-
log.trace("Pyro init done")
16+
self.frontend_connection: Connection = None
17+
self.frontend = None
18+
self.server: ThreadedServer = None
1919

20-
self._frontend:Pyro5.api.Proxy = None
2120
self.connect_to_frontend()
22-
log.trace("Connected to frontend")
21+
self.start_server()
2322
self.register_to_frontend()
24-
log.trace("Registered to frontend")
25-
26-
self.ping = True
27-
threading.Thread(target=self.ping_thread, daemon=True, name="ping_thread").start()
28-
log.trace("Ping thread started")
29-
30-
self.loop = True
31-
self.request_loop_thread = threading.Thread(
32-
target=self.daemon.requestLoop,
33-
kwargs={"loopCondition": lambda: self.loop}
34-
)
35-
36-
self.request_loop_thread.start()
37-
log.trace("Request loop thread started")
3823

3924
def connect_to_frontend(self):
40-
args = self.get_args()
41-
log.info(f"Connecting to {args.uri}")
42-
self.frontend = Pyro5.api.Proxy(args.uri)
25+
port = self.get_args().port
26+
self.frontend_connection = rpyc.connect("localhost", port)
27+
self.frontend = self.frontend_connection.root
28+
29+
def start_server(self):
30+
self.server = ThreadedServer(self, port=0, protocol_config={"allow_public_attrs": True})
31+
# self.server.start()
32+
threading.Thread(target=self.server.start, name="server_start", daemon=False).start()
33+
log.success("Started server")
4334

4435
def register_to_frontend(self):
45-
uri = self.daemon.register(self)
46-
self.frontend.register_backend(backend_uri=uri)
36+
self.frontend.register_backend(port=self.server.port)
4737

48-
def init_pyro5(self):
49-
self.daemon = Pyro5.api.Daemon()
50-
# threading.Thread(target=self.daemon.requestLoop, daemon=True).start()
38+
def on_disconnect(self, conn):
39+
log.info("Connection closed")
40+
if self.server is not None:
41+
self.server.close()
42+
if self.frontend_connection is not None:
43+
self.frontend_connection.close()
5144

5245
def get_args(self):
5346
parser = argparse.ArgumentParser(prog="BackendBase")
54-
parser.add_argument("--uri", type=str)
47+
parser.add_argument("--port", type=str)
5548
args = parser.parse_args()
56-
if args.uri is None:
49+
if args.port is None:
5750
parser.print_help()
58-
exit()
59-
return args
60-
61-
@property
62-
def frontend(self):
63-
# Transfer ownership
64-
if self._frontend is not None:
65-
self._frontend._pyroClaimOwnership()
66-
return self._frontend
67-
68-
@frontend.setter
69-
def frontend(self, value):
70-
self._frontend = value
71-
72-
def ping_thread(self):
73-
while self.ping:
74-
time.sleep(5)
75-
try:
76-
self.frontend.ping()
77-
log.trace("Pinged frontend")
78-
except Pyro5.errors.ConnectionClosedError:
79-
log.error("Failed to ping frontend")
80-
self.on_connection_lost()
81-
return
82-
83-
def on_connection_lost(self):
84-
self.loop = False
85-
self.ping = False
86-
log.info("on_connection_lost triggered")
87-
# join all threads
88-
self.daemon.shutdown()
89-
log.trace("shutdown daemon done")
90-
self.daemon.close()
91-
log.trace("close daemon done")
92-
# for t in threading.enumerate():
93-
# if t is not threading.current_thread():
94-
# t.join()
95-
log.success("Backend stopped. Have a nice day!")
96-
sys.exit(0)
51+
sys.exit()
52+
return args

0 commit comments

Comments
 (0)