Python多线程模型

Fat*_*taş 11 multithreading python-multithreading

我一直在研究 python 中的多线程一段时间,但是我对一些问题感到困惑-

  1. 首先,python线程库创建的线程是用户级线程还是内核级线程?

书中说用户级线程必须映射到内核线程,操作系统只创建和维护内核级线程。

python线程库中将使用哪种线程模型?此外,谁在内核级线程和用户级线程之间做出选择?是操作系统还是程序员有发言权?

如果使用多对一模型(如图所示),我认为它不是真正的多线程,因为所有线程都映射到单个内核线程。

多对一模型

  1. 有没有办法让操作系统在我的 python 程序中遵守某个线程模型?

  2. 是否可以显示进程的所有正在运行的线程,并将它们的状态分别标记为内核级或用户级。还可以显示两个级别(用户和内核)之间的映射吗?

zwe*_*wer 8

通常,您永远不会直接创建“内核级线程”——您在用户空间中所做的一切都在用户空间中执行,否则即使是随机浏览器 JavaScript 也会在内核级执行,从而保证在几秒钟内整个互联网都会变黑。

因此,在大多数语言中,线程接口(如果支持)与实际的“内核线程”相距甚远,并且根据实现,它将链接到较低级别的线程接口(pthreads例如)或只是模拟用户不知道的线程. 沿着这条链走下去,pthreads可能会也可能不会链接到实际的“内核”线程(这在 Linux 上是正确的,但在 Windows 上还有另一个层次的分离)但即便如此,代码还是在用户空间中执行——“支持” ' 内核线程用于控制代码单独运行的调度。

当谈到 CPython 时,它的threading接口链接到pthreads这样,从技术上讲,有一个从 Python 线程一直到内核线程的链。然而,Python 也有可怕的 GIL,几乎可以保证,除了一些与 I/O 相关的罕见异常外,不会有两个线程同时执行,这几乎使它的线程在协作多任务模式下运行。但是,由于在大多数系统上,进程也由内核线程支持,因此您仍然可以通过使用multiprocessing接口充分利用它们。

此外,在您的系统上有多个内核/CPU 之前,甚至内核线程都以协作多任务模式执行,因此,从技术上讲,内核线程不能保证您所描述的实际多线程。

至于如何列出线程及其依赖关系,可以使用top -H -p <pid>来显示进程的线程树。

  • @FatihAltuntaş - 有 _some_ 实际并行执行,因为并非所有线程操作都由 GIL 互斥,但这都是 Python 背景内容,用户对此没有发言权,因此,从用户的角度来看,没有使用 Python `threading` 接口进行并行处理。对于并行处理,你必须使用`multiprocessing`接口,但是你会失去所有的细节,比如共享内存等等(因为 GIL 首先存在的很大一部分原因是内存方面的线程安全问题使用权)。 (2认同)