什么cpu能超频:如果我们创建的线程超过CPU所能承受的数量 会发生什么OS能处理吗:Python-线程

我的 CPU 计数是 8。这意味着我理论上可以有 16 个线程来运行我的多线程程序。我有几个问题。

如果我创建 20 个线程并同时启动它们会发生什么?由于硬件限制,我不能有那么多的线程,操作系统处理它还是我必须从我这边处理它?

即使有 16 个理论线程,有些线程可能已经被其他程序利用。有没有办法在 Python 中获得“可用来利用线程数”,并动态利用最大可能的线程数?

5

我的 CPU 计数是 8。

您可能需要检查这些是否为logical CPUs or physical CPUs

这意味着我理论上可以有 16 个线程来运行我的多线程程序。

不,您可以拥有尽可能多的线程(在合理的范围内;如果您创建数千个线程,事情可能不会很顺利)。操作系统将根据需要将它们调度到物理(或逻辑)CPU 上。

如果我创建 20 个线程并同时启动它们会发生什么?由于硬件限制,我不能有那么多的线程,操作系统处理它还是我必须从我这边处理它?

操作系统处理它。但是,操作系统必须决定哪些线程将运行以及以哪种顺序运行,并且您可能不同意操作系统做出的选择,因此创建太多线程可能会适得其反。此外,在线程之间切换会带来固有的开销,因此,如果您的工作受 CPU 限制,您通常不希望创建比逻辑 CPU 更多的线程。

即使有 16 个理论线程,有些线程可能已经被其他程序利用。有没有办法在 Python 中获得“可用来利用线程数”,并动态利用最大可能的线程数?

这里我们遇到了一个问题:Python 有一个global interpreter lock,所以对于“我可以有效地创建多少个线程?”(而不是“Python 和操作系统允许我创建多少个线程?”),唯一正确的答案是一个。如果创建多个线程,则一次只能执行一个线程执行 Python 字节码。其他线程将无法使用。

Python 的线程的目的不是在多个 CPU 上做工作。相反,它们旨在用于多路复用 I / O。也就是说,您可以根据需要在任意多个线程上启动 I / O 操作 (例如读取或写入文件,网络套接字,管道或其他 IPC 机制),并且所有这些 I / O 操作将动态分配并行运行。当您执行 I / O 操作时,Python 会释放 GIL。

1

您正在混合硬件端超线程和软件端线程。第一个基本上模拟了比您拥有的更多的 CPU 内核。但它与我们在软件编程中所说的线程无关。

线程(软件线程)不像计算机拥有的资源,可以分配给进程。线程就像进程,但是它们共享其父进程的地址空间。因此,它们可以访问相同的变量-不同的进程通常无法做到这一点。

所以你可以打开一个文本编辑器 20 次,你也可以打开一个新的线程 20 次。然而,因为你可以并不意味着你应该:https://stackoverflow.com/a/481979/8575607

进一步阅读:Maximum number of threads per process in Linux?

编辑:添加到kevin的答案:仍然有理由使用多个线程(例如,如果您同时访问软件并绘制 UI),则 GIL 并没有从中受益。或者例如渲染非阻塞 UI 覆盖。尽管在一个 cpython 进程中没有两个 atomar 命令同时执行,但线程仍以并行方式执行。(这是 btwreputment 下的其他人还没有足够的评论,没有评论

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(782)
Rpg编程:如何使用SDL在C++中编程RPG游戏
上一篇
A方加b方加c方等于什么:面向对等方和订购方的 Fabric网络组织结构
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(46条)