Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果我们创建的线程超过CPU的能力,会发生什么?操作系统能处理吗Python线程_Python_Python 3.x_Multithreading - Fatal编程技术网

如果我们创建的线程超过CPU的能力,会发生什么?操作系统能处理吗Python线程

如果我们创建的线程超过CPU的能力,会发生什么?操作系统能处理吗Python线程,python,python-3.x,multithreading,Python,Python 3.x,Multithreading,我的CPU数是8。这意味着理论上我可以有16个线程来运行我的多线程程序。我有几个问题 如果我创建20个线程并同时启动它们会发生什么?由于硬件的限制,我不能拥有那么多的线程,那么操作系统是处理它呢,还是我必须从自己的角度来处理它呢 即使有16个理论线程,一些线程可能已经被其他程序使用。有没有办法在Python中获得“可利用线程数”并动态利用最大可能的线程数 您混合了硬件端超线程和软件端线程。第一个基本上模拟了比您拥有的更多的CPU内核。但它与我们在软件编程中所称的线程无关 线程(软件线程)不像计算

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

  • 如果我创建20个线程并同时启动它们会发生什么?由于硬件的限制,我不能拥有那么多的线程,那么操作系统是处理它呢,还是我必须从自己的角度来处理它呢
  • 即使有16个理论线程,一些线程可能已经被其他程序使用。有没有办法在Python中获得“可利用线程数”并动态利用最大可能的线程数

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

    线程(软件线程)不像计算机拥有的资源,也不像可以分配给进程的资源。线程与进程类似,但它们共享其父进程的地址空间。所以他们可以访问相同的变量——不同的进程通常无法访问

    因此,您可以打开文本编辑器20次,也可以打开新线程20次。然而,因为你可以,并不意味着你应该:

    进一步阅读:


    编辑:添加到s的答案:仍然有理由使用多个线程(例如,如果您同时访问软件并绘制UI),GIL没有从中获得有用性。或用于呈现非阻塞UI覆盖。线程仍然以并行方式执行,尽管在一个cpython进程中没有两个atomar命令同时执行。 (顺便说一句,这不是评论,因为我还没有足够的声誉在别人的帖子下发表评论)

    我的CPU数是8

    您可能需要检查这些是否正确

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

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

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

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

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

    这里我们遇到了一个问题:Python有一个线程,所以“我可以有效地创建多少线程?”(与“Python和操作系统允许我创建多少线程?”)的唯一正确答案是1。如果创建多个线程,一次只能有一个线程执行Python字节码。其他人将不得不等待锁,并且将无法执行任何有用的操作


    Python线程的目的不是在多个CPU上工作。相反,它们用于多路复用I/O。也就是说,您可以在任意多个线程上启动I/O操作(如读取或写入文件、网络套接字、管道或其他IPC机制),所有这些I/O操作都将并行运行。Python在执行I/O操作时会释放GIL,因此它不会阻止这种并行性。如果您试图编写某种类型的服务器,这将非常有用。在这个用例中,您可以为每个I/O操作创建一个线程(如果您不需要太多的话),或者创建一个线程池,动态地将工作项分配给工作线程,例如。

    Hi@Kevin,我使用了“os.cpu\u count()”。它提供了逻辑CPU或物理CPU的数量吗?@PradeepSanjeewa:基于我相信“正确”的答案是逻辑CPU,但显然是在Windows上。