首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python SocketServer死锁问题

Python SocketServer死锁问题
EN

Stack Overflow用户
提问于 2013-07-05 01:34:50
回答 1查看 684关注 0票数 1

当我线程化SocketServer实例( serve_forever方法)时,我可以很容易地在发送文本"shutdown“时退出它,这正是我所期望的。然而,如果它不是线程的,那么我就会遇到它锁定的问题,我不知道如何解决这个问题。

服务器本身的基本流程是开始->监听->获取数据->从服务器获取命令->运行命令(这是一个插件)->return结果。下面是我使用的代码:

代码语言:javascript
复制
import SocketServer as SS

NULL_RESP = {"status" : False, "data" : "No data received."}

class ASWCP_Daemon(SS.BaseRequestHandler):
    def handle(self):
        self.data = self.request.recv(1024).strip()

        if self.data == "":
           self.request.sendall(json.dumps(NULL_RESP))
           return None

       tmp = self.data.split(" ", 1)

       cmd = tmp[0]
       args = ""

       try:
           args = str(tmp[1]).split(conf.command_parse)
    except:
           pass

       plugin = plugins["cmd"][cmd]['ref'].init(conf=conf, socket=self)

       try:
           if args[0] == "help":
            self.request.sendall(plugin.help)
       except IndexError:
           status,data = plugin.run(args)
           resp = {"status" : status, "data" : data}
           self.request.sendall(json.dumps(resp))

  if __name__ == "__main__":
   # Log is created here; conf = config file (irrelevant to this issue)

   try:
       if conf.tcp:
           if conf.threaded:
               import threading
               class ThreadedTCPServer(SS.ThreadingMixIn, SS.TCPServer):
                   pass

               server = ThreadedTCPServer((conf.host, conf.listen_port), ASWCP_Daemon)
           else:
               server = SS.TCPServer((conf.host, conf.listen_port), ASWCP_Daemon)
       else:
           server = SS.UDPServer((conf.host, conf.listen_port), ASWCP_Daemon)

       if conf.threaded:
           sthread = threading.Thread(target=server.serve_forever)
           #sthread.daemon = True
           sthread.start()
       else:
           server.serve_forever()
   except KeyboardInterrupt:
       pass

shutdown插件的run方法如下:

代码语言:javascript
复制
    def run(self, *args, **kwargs):
        if self.socket == None:
            print "> No socket available"
            return (False,"")
        else:
            self.socket.log.info("Shutting down daemon")
            self.socket.server.shutdown()

            return (True,"")

如果是线程化的,这就很好,如果不是线程化的,那么它就会到达插件中的self.socket.server.shutdown()方法。self.socket是ASWCP_Daemon类的实例。

EN

回答 1

Stack Overflow用户

发布于 2013-07-12 21:46:10

代码语言:javascript
复制
    # Do shutdown() if threaded, else execute server_close()
    if self.sysconf.threaded:
        self.socket.server.shutdown()
    else:
        self.socket.server.server_close()

    return (True,"")

self.sysconf是守护进程的配置(问题代码中的conf),self.socket是对流处理程序的引用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17475713

复制
相关文章

相似问题

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