使用隐藏的 _stop() 函数终止线程有什么缺点?
What are the downsides of using the hidden _stop() function to kill a thread?
在寻找使用 Python 开箱即用的线程模块时快速终止线程的方法时,我遇到了这个方法:Use the Hidden _stop()
Function to Kill a Thread in Python
_stop()
函数而不是 public 函数受到保护可能是有原因的。我的假设是,它使不安全地终止线程变得困难,但我很好奇是否还有其他原因。
调用 _stop()
终止线程有什么缺点?
您链接到的代码根本没有调用私有 ._stop()
函数。相反,构造函数将其完全替换为 Event
:
self._stop = threading.Event()
我觉得这毫无意义。
实际的私有 ._stop()
函数不会 停止线程。 threading.py
中没有任何东西可以这样做。相反,在 C 实现确定线程的生命周期 已 (已经)结束后,内部调用私有 ._stop()
函数以维护 Python-level 模块不变量。 user-level 代码调用它是没有意义的。
编辑:顺便说一句,在当前的 Python (>= 3.10) 中,在一个还活着的线程上调用 ._stop()
会立即死于 AssertionError
,这就是它的唯一作用。我记得,在一些较旧的 Python 版本中,._stop()
继续破坏 threading.py
的一些内部结构(破坏了它对哪些线程实际上仍然存在的了解)。但是,在任何情况下,它都不会停止线程。
在寻找使用 Python 开箱即用的线程模块时快速终止线程的方法时,我遇到了这个方法:Use the Hidden _stop()
Function to Kill a Thread in Python
_stop()
函数而不是 public 函数受到保护可能是有原因的。我的假设是,它使不安全地终止线程变得困难,但我很好奇是否还有其他原因。
调用 _stop()
终止线程有什么缺点?
您链接到的代码根本没有调用私有 ._stop()
函数。相反,构造函数将其完全替换为 Event
:
self._stop = threading.Event()
我觉得这毫无意义。
实际的私有 ._stop()
函数不会 停止线程。 threading.py
中没有任何东西可以这样做。相反,在 C 实现确定线程的生命周期 已 (已经)结束后,内部调用私有 ._stop()
函数以维护 Python-level 模块不变量。 user-level 代码调用它是没有意义的。
编辑:顺便说一句,在当前的 Python (>= 3.10) 中,在一个还活着的线程上调用 ._stop()
会立即死于 AssertionError
,这就是它的唯一作用。我记得,在一些较旧的 Python 版本中,._stop()
继续破坏 threading.py
的一些内部结构(破坏了它对哪些线程实际上仍然存在的了解)。但是,在任何情况下,它都不会停止线程。