从客户端关闭RPyC服务器

问题描述 投票:1回答:1

我已经创建了RPyC服务器,可以正常工作,而所有公开的方法都可以工作。现在,我希望从客户端关闭服务器。这有可能吗?安全性不是问题,我不担心流氓连接会关闭服务器。

开始于(哪个正在阻止):

from rpyc import ThreadPoolServer
from service import MyService

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

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

python-3.x python-3.7 rpyc
1个回答
1
投票

您可以将方法添加到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.
© www.soinside.com 2019 - 2024. All rights reserved.