Pra*_*ewa 2 python multithreading python-3.x
我的CPU数量是8。理论上说,我可以有16个线程来运行我的多线程程序。我有几个问题。
我的CPU数是8。
您可能要检查这些是逻辑CPU还是物理CPU。
从理论上讲,这意味着我可以有16个线程来运行我的多线程程序。
不,您可以根据需要拥有尽可能多的线程(在一定程度上);如果您创建了数千个线程,那么事情可能进展得并不顺利。操作系统将根据需要将它们调度到物理(或逻辑)CPU上。
如果我创建20个线程并同时启动它们会怎样?由于硬件限制,我不能拥有太多线程,因此OS是否可以处理它?还是必须从我的角度来处理它?
操作系统处理它。但是,操作系统必须决定哪个线程将以什么顺序运行,并且您可能不同意操作系统所做的选择,因此创建太多线程可能会适得其反。另外,线程之间的切换会带来固有的开销,因此,如果您的工作受CPU限制,那么通常不希望创建的线程多于逻辑CPU。
即使理论上有16个线程,某些线程也可能已被其他程序利用。有没有办法在Python中获得“可利用的线程数”并动态地利用最大可能的线程数?
在这里,我们遇到了一个问题:Python具有全局解释器锁,因此唯一正确的答案是“我可以有效地创建多少个线程?” (与“ Python和操作系统允许我创建多少个线程?”相对)是一个。如果创建多个线程,则一次只能有一个线程执行Python字节码。其他人将不得不等待锁,并且将无法做任何有用的事情。
Python线程的目的不是要在多个CPU上工作。而是将它们用于多路复用I / O。也就是说,您可以在任意数量的线程上启动I / O操作(例如读取或写入文件,网络套接字,管道或其他IPC机制),并且所有这些I / O操作将并行运行。当您执行I / O操作时,Python会释放GIL,因此它不会阻止这种并行性。如果您要编写某种服务器,这将很有用。在此用例中,您可以为每个I / O操作创建一个线程(如果不需要太多),或者创建一个线程池,该池动态地将工作项分配给工作线程,例如使用concurrent.futures.ThreadPoolExecutor。
您正在混合硬件端超线程和软件端线程。第一个基本上模拟比您拥有的更多的 CPU 核心。但它与我们在软件编程中所说的线程无关。
线程(软件线程)不像计算机拥有的可以分配给进程的资源。线程就像进程一样,但它们共享父进程的地址空间。因此它们可以访问相同的变量——不同的进程通常不能这样做。
因此,正如您可以打开文本编辑器 20 次一样,您也可以打开新线程 20 次。尽管如此,因为你可以并不意味着你应该:/sf/answers/33738561/
进一步阅读:Linux 中每个进程的最大线程数?
编辑:添加到kevin的答案:仍然有理由使用多个线程(例如,如果您同时访问软件并绘制 UI),GIL 并没有从中获得用处。或者用于渲染非阻塞 UI 叠加层。尽管一个 cpython 进程中不会同时执行两个原子命令,但线程仍然以并行方式执行。 (顺便说一句,这不是评论,因为我还没有足够的声誉在其他人的帖子下发表评论)
| 归档时间: |
|
| 查看次数: |
259 次 |
| 最近记录: |