如何从内部关闭线程?

65 投票
4 回答
215342 浏览
提问于 2025-04-16 09:05

每当有客户端连接到我的服务器时,我就会创建一个新的线程,像这样:

# Create a new client
c = Client(self.server.accept(), globQueue[globQueueIndex], globQueueIndex, serverQueue )

# Start it
c.start()

# And thread it
self.threads.append(c)

现在,我知道我可以用这段代码关闭所有的线程:

    # Loop through all the threads and close (join) them
    for c in self.threads:
        c.join()

但是,我该如何在这个线程内部关闭它自己呢?

4 个回答

30

虽然有点晚了,但我用一个叫 _is_running 的变量来告诉线程什么时候该关闭。这种方法很简单,只需要在你的线程类里面实现一个 stop() 方法。

def stop(self):
  self._is_running = False

然后在 run() 方法里,只需要用 while(self._is_running) 来循环就可以了。

35

关于来自 sys 模块的 sys.exit(),你觉得怎么样?

如果在一个线程中执行 sys.exit(),它只会关闭那个线程。

这里有个回答讨论了这个问题:为什么在 Python 中在线程内调用 sys.exit() 不会退出?

82

当你启动一个线程时,它会开始执行你给它的一个函数(如果你在扩展 threading.Thread,那么这个函数就是 run())。要结束这个线程,只需要从那个函数中返回就可以了。

根据 这个链接,你还可以调用 thread.exit(),这会抛出一个异常,让线程悄悄结束。

撰写回答