我已经创建了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.