Files
grum/rpcserverthread.py
T

58 lines
1.2 KiB
Python

import atexit
from threading import Thread
from rpcserver import RPCServer
class RPCServerThread(Thread):
def __init__(self, *args, **kwargs):
super().__init__(daemon=True) # atexit seems to only work for deamon threads
self.server = RPCServer(*args, **kwargs)
self.thread_shutdown = None
def run(self):
atexit.register(self.wait_for_stop)
self.server.serve_forever()
# BaseServer.shutdown docs say:
# This must be called while serve_forever() is running in another thread,
# or it will deadlock.
def wait_for_stop(self):
if self.thread_shutdown is None:
self.stop()
self.thread_shutdown.join()
print("RPC server stopped")
def stop(self):
self.thread_shutdown = t = Thread(target=self.shutdown)
t.start()
def shutdown(self):
self.server.shutdown()
self.server.server_close()
if __name__ == "__main__":
from time import sleep
def test():
print("test")
return "test"
rst = RPCServerThread("localhost", 8000)
rst.server.register_function(test)
rst.server.register_function(rst.stop)
rst.start()
while rst.is_alive():
sleep(1)