Fat*_*taş 11 multithreading python-multithreading
我一直在研究 python 中的多线程一段时间,但是我对一些问题感到困惑-
书中说用户级线程必须映射到内核线程,操作系统只创建和维护内核级线程。
python线程库中将使用哪种线程模型?此外,谁在内核级线程和用户级线程之间做出选择?是操作系统还是程序员有发言权?
如果使用多对一模型(如图所示),我认为它不是真正的多线程,因为所有线程都映射到单个内核线程。
有没有办法让操作系统在我的 python 程序中遵守某个线程模型?
是否可以显示进程的所有正在运行的线程,并将它们的状态分别标记为内核级或用户级。还可以显示两个级别(用户和内核)之间的映射吗?
通常,您永远不会直接创建“内核级线程”——您在用户空间中所做的一切都在用户空间中执行,否则即使是随机浏览器 JavaScript 也会在内核级执行,从而保证在几秒钟内整个互联网都会变黑。
因此,在大多数语言中,线程接口(如果支持)与实际的“内核线程”相距甚远,并且根据实现,它将链接到较低级别的线程接口(pthreads例如)或只是模拟用户不知道的线程. 沿着这条链走下去,pthreads可能会也可能不会链接到实际的“内核”线程(这在 Linux 上是正确的,但在 Windows 上还有另一个层次的分离)但即便如此,代码还是在用户空间中执行——“支持” ' 内核线程用于控制代码单独运行的调度。
当谈到 CPython 时,它的threading接口链接到pthreads这样,从技术上讲,有一个从 Python 线程一直到内核线程的链。然而,Python 也有可怕的 GIL,几乎可以保证,除了一些与 I/O 相关的罕见异常外,不会有两个线程同时执行,这几乎使它的线程在协作多任务模式下运行。但是,由于在大多数系统上,进程也由内核线程支持,因此您仍然可以通过使用multiprocessing接口充分利用它们。
此外,在您的系统上有多个内核/CPU 之前,甚至内核线程都以协作多任务模式执行,因此,从技术上讲,内核线程不能保证您所描述的实际多线程。
至于如何列出线程及其依赖关系,可以使用top -H -p <pid>来显示进程的线程树。