11import argparse
2- import Pyro5 .api
32import threading
4- import time
53import sys
6- import os
74from loguru import logger as log
85
96log .remove (0 )
107log .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