如何从内部关闭线程?

ske*_*rit 46 python multithreading

对于连接到我的服务器的每个客户端,我生成一个新线程,如下所示:

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

# Start it
c.start()

# And thread it
self.threads.append(c)
Run Code Online (Sandbox Code Playgroud)

现在,我知道我可以使用以下代码关闭所有线程:

    # Loop through all the threads and close (join) them
    for c in self.threads:
        c.join()
Run Code Online (Sandbox Code Playgroud)

但我怎么能关闭线程该线程?

Rei*_*ica 56

当你启动一个线程时,它开始执行你给它的一个函数(如果你正在扩展threading.Thread,那么函数将是run()).要结束线程,只需从该函数返回.

根据这个,你也可以调用thread.exit(),这将抛出一个异常,它将以静默方式结束线程.

  • thread.exit()仅适用于线程对象,但不适用于threading.Thread类对象. (26认同)
  • 看起来 exit() 方法在 python 3.7 中不可用 调用后: threading.enumerate()[1].exit() 我收到错误: AttributeError: 'Thread' object has no attribute 'exit' 有其他选择吗? (3认同)

Eri*_*sum 19

有点晚了,但是_is_running当我想关闭时,我使用一个变量告诉线程.它易于使用,只需在线程类中实现stop()即可.

def stop(self):
  self._is_running = False
Run Code Online (Sandbox Code Playgroud)

并在run()循环中while(self._is_running)


kry*_*ght 9

sys.exit()从模块怎么样sys.

如果sys.exit()从一个线程中执行,它将仅关闭该线程.

这里的答案说明了这一点:为什么sys.exit()在Python中的线程内调用时不会退出?

  • 这是一个很棒、简单的解决方案。谢谢你!此外,它还可以与多处理模块或线程一起使用。 (4认同)

小智 5

如果你想强制停止你的线程: thread._Thread_stop() 对我来说效果很好。

  • 为了改进您的答案,您应该包括 _when_ it 是比此处列出的其他选项更好的替代方案,以及指向支持它的某些文档的链接。 (3认同)