Can';关闭Python应用程序

Can';关闭Python应用程序,python,multithreading,sockets,wxpython,Python,Multithreading,Sockets,Wxpython,我有一个服务器应用程序,它通过套接字接收来自同一网络上其他应用程序的消息,并不断运行以等待消息。这实际上只是一个触发器,它似乎工作得很好 但我无法关闭应用程序。当我点击close时,GUI冻结,我找不到解决方案。以下是服务器代码的相关部分: class blah blah... def handler(self, clientsocket, clientaddr): clientsocket.close() threading.Thread(target

我有一个服务器应用程序,它通过套接字接收来自同一网络上其他应用程序的消息,并不断运行以等待消息。这实际上只是一个触发器,它似乎工作得很好

但我无法关闭应用程序。当我点击close时,GUI冻结,我找不到解决方案。以下是服务器代码的相关部分:

class blah blah...

    def handler(self, clientsocket, clientaddr):
        clientsocket.close()
        threading.Thread(target=self.SendFolder).start()

    def listen(self):
        host = ''
        port = 55567
        buf = 1024
        addr = (host, port)
        self.serversocket = socket(AF_INET, SOCK_STREAM)
        self.serversocket.bind(addr)
        self.serversocket.listen(2)
        while 1:
            print "Server is listening for connections\n"     
            clientsocket, clientaddr = self.serversocket.accept()
            threading.Thread(target=self.handler, args=(clientsocket, clientaddr)).start()
        self.serversocket.close()

    def OnClose(self, e):
        wx.CallAfter(CloseApp())


class CloseApp(wx.Frame):
    def __init__(e):
        sys.exit(0)

如果您不关心清理程序出口的线程,请考虑将它们标记为“守护进程”线程。


清理线程(和套接字)是一种很好的做法,而不知道应用程序是如何挂接在一起的,这可能会出现在OnClose()中。例如,在任意点终止self.SendFolder()是否可以,或者它是否需要完成其当前操作?

我在启动循环线程时使用了
self.listenThread.daemon=True
修复了它。 因此,现在当我使用“关闭”按钮时,应用程序正确存在,没有冻结。
如果我单击应用程序(窗口)右上角的“X”,应用程序将关闭,但线程没有正确退出,无论如何,我可以绕过这个问题?

您正在启动线程,但在退出之前没有停止它们!当你需要存在的时候,你必须关闭你启动的所有线程…所以也许你应该考虑一下我的答案。