Python多线程模型

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

学习python多线程有一段时间了,但是有几个问题很迷茫-

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

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

pythonthreading库会用到什么线程模型?此外,谁在内核和用户级线程之间做出选择?是操作系统还是程序员有发言权?

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

  1. 有没有办法让操作系统在我的 python 程序中遵循特定的线程模型?

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

multithreading python-multithreading
2个回答
9
投票

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

因此,在大多数语言中,线程接口(如果支持的话)与实际的“内核线程”相去甚远,并且根据实现,它将链接到较低级别的线程接口(例如

pthreads
)或只是模拟用户不知道的线程。沿着这条链向下,
pthreads
可能会或可能不会链接到实际的“内核”线程(在 Linux 上恰好是这样,但在 Windows 上有另一个分离级别)但即便如此,代码在用户空间中执行 - “支持”内核线程在那里控制代码单独运行的调度。

谈到 CPython,它的

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

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

关于如何列出线程及其依赖关系,可以使用

top -H -p <pid>
展示一个进程的线程树


0
投票

此外,直到你的系统上有多个内核/CPU,甚至内核 线程以协作多任务模式执行,因此,从技术上讲, 内核线程并不能像您一样保证实际的多线程 描述它。

这是不准确的——即使在单核 CPU 上,内核线程也不是“合作的”,它们是抢占式的。不同之处在于,对于抢占式线程,它们的运行时间都是有保证的。在协作式多任务处理中,一个写得不好的线程可能会使所有其他线程在任何运行时都饿死。

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