python - 杀死多线程SocketServer

标签 python multithreading python-2.7 kill

我试图弄清楚为什么我无法通过 CRTL-C 杀死我的多线程 SocketServer。

基本上我有:

import SocketServer,threading

class TEST(SocketServer.BaseRequestHandler):
    def server_bind(self):
        self.socket.setsockopt(SOL_SOCKET, SO_REUSEADDR,SO_REUSEPORT, 1)
        self.socket.bind(self.server_address)
        self.socket.setblocking(0)

    def handle(self):
        request, socket = self.request
        data = request
        if data[0] == "\x01":
           buff = "blablabla"
           socket.sendto(str(buff), self.client_address)

class TEST1(SocketServer.BaseRequestHandler):
    def server_bind(self):
        self.socket.setsockopt(SOL_SOCKET, SO_REUSEADDR,SO_REUSEPORT, 1)
        self.socket.bind(self.server_address)
        self.socket.setblocking(0)

    def handle(self):
        request, socket = self.request
        data = request
        if data[0] == "\x01":
           buff = "blablabla"
           socket.sendto(str(buff), self.client_address)

class TEST2(SocketServer.BaseRequestHandler):
    def server_bind(self):
        self.socket.setsockopt(SOL_SOCKET, SO_REUSEADDR,SO_REUSEPORT, 1)
        self.socket.bind(self.server_address)
        self.socket.setblocking(0)

    def handle(self):
        request, socket = self.request
        data = request
        if data[0] == "\x01":
           buff = "blablabla"
           socket.sendto(str(buff), self.client_address)

class TEST3(SocketServer.BaseRequestHandler):
    def server_bind(self):
        self.socket.setsockopt(SOL_SOCKET, SO_REUSEADDR,SO_REUSEPORT, 1)
        self.socket.bind(self.server_address)
        self.socket.setblocking(0)

    def handle(self):
        request, socket = self.request
        data = request
        if data[0] == "\x01":
           buff = "blablabla"
           socket.sendto(str(buff), self.client_address)

def serve_thread_udp(host, port, handler):
    server = SocketServer.UDPServer((host, port), handler)
    server.serve_forever()

def serve_thread_tcp(host, port, handler):
    server = SocketServer.TCPServer((host, port), handler)
    server.serve_forever()

def main():
    try:
      threading.Thread(target=serve_thread_tcp,args=('', 4045,TEST)).start()
      threading.Thread(target=serve_thread_tcp,args=('', 239,TEST1)).start()
      threading.Thread(target=serve_thread_udp,args=('', 1246,TEST2)).start()
      threading.Thread(target=serve_thread_tcp,args=('', 12342,TEST3)).start()
    except KeyboardInterrupt:
        os._exit()

if __name__ == '__main__':
    try:
        main()
    except:
        raise

我试图了解我做错了什么,以及通过 crtl-c 杀死整个脚本的最佳方法是什么。 任何帮助将不胜感激!

谢谢

最佳答案

这是一个解决方案:

def main():
    import thread
    try:
      thread.start_new(serve_thread_tcp, ('', 4045,TEST))
      thread.start_new(serve_thread_tcp,('', 239,TEST1))
      thread.start_new(serve_thread_udp,('', 1246,TEST2))
      thread.start_new(serve_thread_tcp,('', 12342,TEST3))
    except KeyboardInterrupt:
        os._exit()

if __name__ == '__main__':
    try:
        main()
    except:
        raise
    raw_input()

要关闭服务器,您可以键入 return 或关闭标准输入。

问题在于 Thread 类不允许在所有 Threads 关闭之前关闭应用程序。

serve_forever() 不会结束,直到您在 KeyboardInterrupt 上关闭服务器(另一个解决方案)的归属。

关于python - 杀死多线程SocketServer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12329541/

相关文章:

python - 使用子进程通过 shell 卸载 OpenJDK

python - 如何使用嵌套循环在 Python 中创建模式?

java - 扩展 vert.x 中的工作池

c - 在 Windows 上编译多线程 C 程序时使用 rand_r 获取未声明的函数和 undefined symbol 错误

python-2.7 - 注册商标 : Why does strip remove ® but replace can't find it? 如何从文件夹和文件名中删除符号?

python - Zappa 不打包嵌套的源目录

python - 抽象类作为外键

java - setContextClassLoader 的含义

python-2.7 - 列出 python 脚本中使用的所有变量

python - 重写我的分数文本文件以确保它只有最后 4 个分数 (python)