退出Python中的线程的解决方法

时间:2018-04-10 03:28:23

标签: python multithreading python-multithreading

我正在尝试编写服务器程序,并且我有一个用于侦听新客户端的线程:

class ClientFinder(Thread):
    def __init__(self, port):
        Thread.__init__(self)
        self._continue = True
        self._port = port
        # try to create socket

    def run(self):
        # listen for new clients
        while self._continue:
            # add new clients

    def stop(self):
        # stop client
        self._continue = False

client_finder = ClientFinder(8000)
client_finder.start()
client_finder.stop()
client_finder.join()

我无法加入client_finder,因为它永远不会结束。调用stop()可让线程在接受下一个客户端后停止,因此该程序将永远挂起。

1)即使我没有加入所有线程(例如删除连接),我的程序是否可以结束?或者是这种懒惰/糟糕的做法?

2)如果这是一个问题,避免这种情况的解决方案/最佳做法是什么?从我到目前为止所发现的,没有办法强迫线程停止。

1 个答案:

答案 0 :(得分:0)

是否等待当前客户完成是一个问题,这是你的选择。这可能是一个好主意,或者您可能更愿意终止连接。

等待新客户可能更糟糕,因为它可能永远不会发生。一个简单的解决方案是让一些合理的超时听取 - 让我们说如果没有人在5s连接,你会回到循环检查标志。这对于典型的关机解决方案来说足够短,但足够长,以至于重新检查不会影响您的CPU使用率。

如果您不想等待短暂超时,可以在执行关闭的线程和ClientFinder之间添加管道/套接字,并向关闭发送通知。您不必等待新客户端,而是需要等待两个fds(我假设ClientFinder使用套接字)并检查其中哪一个收到了消息。