我正在使用 Python 3 中的线程 SocketServer 开发一个“简单”服务器。
我在实施时遇到了很多麻烦shutdown为了这。我在互联网上找到的下面的代码最初可以工作,但在通过 telnet 从客户端发送一些命令后停止工作。一些调查告诉我它挂在 threading._shutdown... threading._wait_for_tstate_lock 中,但到目前为止这还没有敲响警钟。
我的研究告诉我,关于如何在不同的 Python 版本中做到这一点,有大约 42 种不同的解决方案、框架等。到目前为止我找不到 python3 的工作方法。例如。我爱远程网络服务
(https://pypi.python.org/pypi/telnetsrv/0.4 https://pypi.python.org/pypi/telnetsrv/0.4)适用于 python 2.7(它使用 gevent 中的 greenlets),但这个不适用于 python 3。因此,如果有一种更 pythonic、std lib 方法或可靠工作的方法,我很想听听!
我目前的赌注是使用套接字服务器,但我还不知道如何处理挂起的服务器。我删除了所有日志语句和大部分功能,因此我可以发布这个暴露问题的最小服务器:
# -*- coding: utf-8 -*-
import socketserver
import threading
SERVER = None
def shutdown_cmd(request):
global SERVER
request.send(bytes('server shutdown requested\n', 'utf-8'))
request.close()
SERVER.shutdown()
print('after shutdown!!')
#SERVER.server_close()
class service(socketserver.BaseRequestHandler):
def handle(self):
while True:
try:
msg = str(self.request.recv(1024).strip(), 'utf-8')
if msg == 'shutdown':
shutdown_cmd(msg, self.request)
else:
self.request.send(bytes("You said '{}'\n".format(msg), "utf-8"))
except Exception as e:
pass
class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
pass
def run():
global SERVER
SERVER = ThreadedTCPServer(('', 1520), service)
server_thread = threading.Thread(target=SERVER.serve_forever)
server_thread.daemon = True
server_thread.start()
input("Press enter to shutdown")
SERVER.shutdown()
if __name__ == '__main__':
run()
如果能够从处理程序停止服务器,那就太好了(请参阅 shutdown cmd)