我正在尝试编写服务器程序,并且我有一个用于侦听新客户端的线程:
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)如果这是一个问题,避免这种情况的解决方案/最佳做法是什么?从我到目前为止所发现的,没有办法强迫线程停止。
答案 0 :(得分:0)
是否等待当前客户完成是一个问题,这是你的选择。这可能是一个好主意,或者您可能更愿意终止连接。
等待新客户可能更糟糕,因为它可能永远不会发生。一个简单的解决方案是让一些合理的超时听取 - 让我们说如果没有人在5s连接,你会回到循环检查标志。这对于典型的关机解决方案来说足够短,但足够长,以至于重新检查不会影响您的CPU使用率。
如果您不想等待短暂超时,可以在执行关闭的线程和ClientFinder
之间添加管道/套接字,并向关闭发送通知。您不必等待新客户端,而是需要等待两个fds(我假设ClientFinder
使用套接字)并检查其中哪一个收到了消息。