如何在没有线程配合的情况下中断或向 python 线程发送信号?

问题描述 投票:0回答:1

以前我认为在 Python 中不可能以非合作方式中断线程。一个例子可能是主线程要求立即取消进程中的其他广告。但是,从信号文档来看:

Python 信号处理程序始终在主 Python 线程中执行 主解释器的,即使信号是在另一个解释器中接收到的 线。这意味着信号不能用作 线程间通信。

...但是...

https://youtu.be/9OOJcTp8dqE?si=_GVmIcCGX9JTawXZ&t=1872

建议是:

[…]Python 已经有了一种请求线程处理异步信号和异常的机制 […]

我看到Java有Thread.interrupt(),但Python没有。

那么,现在用 Python 可以吗?

python python-multithreading
1个回答
0
投票

您希望线程如何“非协作”响应?

视频中提到的机制,顺便说一句,是 Python 运行时本身使用的一种内部机制,在诸如讲座中尝试的黑客攻击中。

所以,回到它应该如何工作 - 信号处理程序是一个注册回调,所以即使这会暴露给 Python 代码 - 每个线程信号回调,使这项工作比简单地拥有一个队列要困难得多从哪里读取说明。 (并且注册每线程回调很难说是线程端的“非协作”)。

无论如何,不。一旦 Python 线程运行,它将继续运行,直到“代码不足”(它从启动线程时作为“目标”参数传递的入口函数返回)。人们可以通过使用队列中的元素进行线程间通信,并在队列上给出适当的信号、引发异常或跳出工作循环来强制发生这种情况。 (这种模式被称为“毒丸”)。这就是它的工作原理。

在 Python 3.12 中,人们可以使用免 GIL 的“子解释器”,同样的逻辑也适用 - 但入口点不是函数,而是一串代码:如果从字符串“计算代码”结束”,解释器进入空闲状态 - 并且必须明确将其关闭。但是除了关闭要使用的“空闲”子解释器之外,没有其他机制。 (虽然可以调用关闭非空闲子解释器,但这很可能会导致 Python 运行时崩溃)。

© www.soinside.com 2019 - 2024. All rights reserved.