python-3.x - 从客户端关闭 RPyC 服务器
问题描述
我创建了一个 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.
推荐阅读
- java - eclipse中如何使用MyBatis连接SQLserver
- javascript - 无法确定类的模块 - ng build --prod
- jquery - jquery全局变量不能从外部访问
- sql - 如何从表中删除多条记录(在输入中获取多个值)
- xamarin.ios - 尝试在物理设备上测试应用程序时出错
- python - 在 Keras 中使用减去层
- sqlite - 有没有办法更有效地使用 python 从 sqlite3 数据库中获取数据到列表中?
- codeigniter - 日期比较不适用于我的 codeigniter 模型类
- jquery - 如何在 Angular 6 中使用 jquery 更新 ngModel?
- git - Azure DevOps 构建过程 创建 Git 分支