首页 > 解决方案 > 从客户端关闭 RPyC 服务器

问题描述

我创建了一个 RPyC 服务器。连接有效,我所有公开的方法都有效。现在我正在寻找从客户端关闭服务器。这甚至可能吗?安全性不是问题,因为我不担心恶意连接会关闭服务器。

它以(阻塞)开始:

from rpyc import ThreadPoolServer
from service import MyService

t = ThreadPoolServer(MyService(), port=56565)
t.start()

现在我只需要关闭它。我还没有找到任何关于停止服务器的文档。

标签: python-3.xpython-3.7rpyc

解决方案


您可以将方法添加到您的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.

推荐阅读