Python 停止UDP SocketServer

Python 停止UDP SocketServer,python,multithreading,socketserver,Python,Multithreading,Socketserver,我正在创建一个UDP SocketServer,如果从客户端收到关闭消息,我想关闭,而不是关闭UDP连接 当我收到消息时,将显示Begin,但不显示Finished。如何退出此线程 class MyUDPHandler( SocketServer.BaseRequestHandler ): def handle( self ): data = self.request[0].strip() dic = self.string_

我正在创建一个UDP SocketServer,如果从客户端收到关闭消息,我想关闭,而不是关闭UDP连接

当我收到消息时,将显示
Begin
,但不显示
Finished
。如何退出此线程

class MyUDPHandler( SocketServer.BaseRequestHandler ):       
    def handle( self ):
        data = self.request[0].strip()        
        dic = self.string_XML_to_dic( data )
        if( dic['Cmd'] == str(UDPConst().SHUT_DOWN )): 
            print('Begin')           
            self.server.shutdown()
            print("Finished")

if __name__ == "__main__": 
    HOST, PORT = "", prop['udpport']
    server = SocketServer.UDPServer( ( HOST, PORT ), MyUDPHandler )    
    server.serve_forever()

由于您没有在服务器自己的线程中运行服务器(为此需要继承
ThreadingMixIn
),因此不能使用
shutdown
,因为这将导致死锁。从中的功能文档注释:

阻塞,直到循环完成。这必须在 serve_forever()正在另一个线程中运行,否则它将 僵局


由于您没有在服务器自己的线程中运行服务器(为此需要继承
ThreadingMixIn
),因此不能使用
shutdown
,因为这将导致死锁。从中的功能文档注释:

阻塞,直到循环完成。这必须在 serve_forever()正在另一个线程中运行,否则它将 僵局

说明:

  • 按下Control-C或将kill发送至pid--功能时 =停止\u侦听器被调用
  • function=stop_listener,然后调用UDPServer引用上的shutdown-
  • 这有助于清除侦听器
说明:

  • 按下Control-C或将kill发送至pid--功能时 =停止\u侦听器被调用
  • function=stop_listener,然后调用UDPServer引用上的shutdown-
  • 这有助于清除侦听器

将其表示为shutdown()“告诉永远服务()循环停止并等待它停止”。您要等待多长时间才能执行清理和关闭?表示shutdown()“告诉serve_forever()循环停止并等待它停止”。您等待它执行清理和关闭的时间有多长?那么我如何关闭UDP服务器呢?@KicsiMano通过让
MyUDPHandler
也继承
ThreadingMixIn
将其放入自己的线程中。这些都在文档中。那么我如何才能关闭UDP服务器呢?@KicsiMano通过让
MyUDPHandler
也继承
ThreadingMixIn
将其放入自己的线程中。这些都在文档中。
# Step 1 - Create a global object
global_object = dict()

# Step 2 - Create a function that will receive kill, Control-C signals
def stop_listener(*args): 
   global_object['listener_server'].shutdown()

# Step 3 - Assign kill, and Control-C signal to function=stop_listener
import signal
signal.signal(signal.SIGINT , stop_listener)
signal.signal(signal.SIGTERM, stop_listener)

# Step 4 - Create UDP Server in usual way, and save a reference in global_object
server = socketserver.UDPServer(...)
global_object['listener_server'] = server
server.serve_forever()