首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何优雅地结束SocketServer

如何优雅地结束SocketServer
EN

Stack Overflow用户
提问于 2015-05-13 02:26:51
回答 1查看 859关注 0票数 2

如果可能的话,我想留在std库里。我的所有线程都在运行,套接字将适当地侦听。我需要能够优雅地关闭套接字,但我似乎无法回到它们的正确关闭。

问题是,当我到达server_close()时,它会对我产生影响(参见下面的异常跟踪输出)。

谢谢你找我!

代码语言:javascript
复制
import sys
import threading
import SocketServer


class EchoRequestHandler(SocketServer.BaseRequestHandler):

    def __init__(self, request, client_address, server):
        SocketServer.BaseRequestHandler.__init__(self, request, client_address, server)
        return

    def setup(self):
        return SocketServer.BaseRequestHandler.setup(self)

    def handle(self):
        # Echo the back to the client
        data = self.request.recv(1024)
        return

    def finish(self):
        return SocketServer.BaseRequestHandler.finish(self)


class EchoServer(SocketServer.TCPServer):

    def __init__(self, server_address, handler_class=EchoRequestHandler):
        SocketServer.TCPServer.__init__(self, server_address, handler_class)
        return

    def server_activate(self):
        SocketServer.TCPServer.server_activate(self)
        return

    def serve_forever(self):
        while True:
            self.handle_request()
        return

    def server_close(self):
        return SocketServer.TCPServer.server_close(self)



def bind_sockets(port_list):

    server_list = []
    for port in port_list:

        server = EchoServer(("", int(port)), EchoRequestHandler)
        server_thread = threading.Thread(target=server.serve_forever)
        server_thread.setDaemon(True)
        server_thread.start()
        server_list.append(server)
        print "listening on port", port

    return server_list


def main():

    port_list = [12345,54321]

    active_servers = bind_sockets(port_list)

    print "Hit Q to quit or R to reload."

    while 1:
        key_press = sys.stdin.read(1)

        if key_press == "q":
            sys.exit(2)
        elif key_press == "r":
            #We need to close gracefully so we can go on to do other stuff.
            print active_servers.__len__()
            for server in active_servers:
                server.server_close()
                print "closed"


if __name__ == "__main__":
    main()

我得到的异常堆栈跟踪是:

代码语言:javascript
复制
Exception in thread Thread-1: Traceback (most recent call last): 
File "~snip~/threading.py", line 810, in __bootstrap_inner self.run() 
File "~snip~/threading.py", line 763, in run self.__target(*self.__args, **self.__kwargs) 
File "kill_thread.py", line 36, in serve_forever self.handle_request() 
File "~snip~/SocketServer.py", line 276, in handle_request fd_sets = _eintr_retry(select.select, [self], [], [], timeout) 
File "~snip~/SocketServer.py", line 155, in _eintr_retry return func(*args) error: (9, 'Bad file descriptor')
EN

回答 1

Stack Overflow用户

发布于 2017-06-13 10:27:35

你有两个问题:

  • 您需要调用shutdown()
  • 不应该覆盖server_forever()

就像这样:

代码语言:javascript
复制
# don't overrule server_forever, the default implementation
# handles the shutdown()
#def serve_forever(self):
#    while True:
#        self.handle_request()
#    return

def server_close(self):
    self.shutdown()
    return SocketServer.TCPServer.server_close(self)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30204612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档