我创建了一个 RPyC 服务器。连接有效,我所有公开的方法都有效。现在我正在寻找从客户端关闭服务器。这甚至可能吗?安全性不是问题,因为我不担心恶意连接会关闭服务器。
它以(阻塞)开始:
from rpyc import ThreadPoolServer
from service import MyService
t = ThreadPoolServer(MyService(), port=56565)
t.start()
现在我只需要关闭它。我还没有找到任何关于停止服务器的文档。
我创建了一个 RPyC 服务器。连接有效,我所有公开的方法都有效。现在我正在寻找从客户端关闭服务器。这甚至可能吗?安全性不是问题,因为我不担心恶意连接会关闭服务器。
它以(阻塞)开始:
from rpyc import ThreadPoolServer
from service import MyService
t = ThreadPoolServer(MyService(), port=56565)
t.start()
现在我只需要关闭它。我还没有找到任何关于停止服务器的文档。
您可以将方法添加到您的Service
类中:
def exposed_stop(self):
pid = os.getpid()
if platform.system() == 'Windows':
PROCESS_TERMINATE = 1
handle = ctypes.windll.kernel32.OpenProcess(PROCESS_TERMINATE, False, pid)
ctypes.windll.kernel32.TerminateProcess(handle, -1)
ctypes.windll.kernel32.CloseHandle(handle)
else:
os.kill(pid, signal.SIGTERM)
这将使服务获得自己的 PID 并向自己发送 SIGTERM。隐藏在 API 的某个黑暗角落可能有更好的方法,但我没有找到更好的方法。
如果您想在线程终止之前进行清理,您可以设置退出陷阱:
t = rpyc.utils.server.ThreadedServer(service, port=port, auto_register=True)
# Set up exit traps for graceful exit.
signal.signal(signal.SIGINT, lambda signum, frame: t.close())
signal.signal(signal.SIGTERM, lambda signum, frame: t.close())
t.start() # blocks thread
# SIGTERM or SIGINT was received and t.close() was called
print('Closing service.')
t = None
shutil.rmtree(tempdir)
# etc.