我在 python 中写了一个无限循环来打印不!在输出中。
while True:
print("No!")
当我执行它时,我在 Windows 任务管理器中看到它的进程 (pythonw.exe) 使用了 60% 的 CPU。我右键单击它的进程并将优先级更改为低的. 它又占用了 60% 的 CPU!然后我将优先级改为即时的。它仍然使用 60% 的 CPU!
更新:所有进程的总 CPU 使用率为 80%!!!还有 20% 是空闲的!为什么这个 Python 循环不使用这 20%?!
优先级有什么问题?为什么它没有改变?
答案1
当多个线程竞争 CPU 时间时,优先级决定哪个线程可以运行。如果没有其他线程需要 CPU,则无论优先级如何,程序的线程都会在需要时获得高达 100% 的 CPU 时间。
在您的例子中,Python 进程是唯一需要大量 CPU 时间的进程,因此它将获得它所要求的一切。如果您的系统很忙,那么您会看到 60% 的下降幅度比它具有正常优先级时要大得多。
您应该针对同时运行的另一个消耗 CPU 的程序进行测试,例如在 CMD shell 中运行包含以下内容的 test.cmd:
:Loop
dir /s c:\
goto Loop
然后您将看到更改竞争进程的优先级的效果。请注意,此示例的 CPU 要求会有所不同,具体取决于 CPU 速度、文件数量c:\
和磁盘缓存大小;将输出重定向dir
到>nul:
将增加 CPU 负载。
答案2
优先权并没有错。
人们普遍认为,如果为某个进程设置了低优先级或中等优先级,那么操作系统就会限制该进程线程可用的 CPU 时间,因此,将其优先级设置得更高应该可以让它使用更多的 CPU!
但事实并非如此。
您可以将一个进程设置为最低优先级,并且如果其代码永远不需要等待任何事情,并且系统上没有其他任何东西需要 CPU 时间,则该进程将获得 100% 的 CPU。
如果某个进程的 CPU 使用率低于 100%,且没有同等或更高优先级的进程尝试运行,则这仅意味着该进程的线程正在花费部分时间不想要CPU。
如果线程不需要 CPU,它会做什么?大多数时候它都在“等待”。当线程需要执行某些操作而不涉及在 CPU 中运行线程自己的代码时,它们会等待。通常它们在等待 I/O 操作完成。这可能是线程明确请求的 I/O 请求,也可能是硬页面错误。(另一方面,“等待”RAM 读取或写入延迟所花费的时间都是线程 CPU 时间的一部分。这不被视为 I/O。)
Python 中的循环包含“打印”函数。这是一个 I/O 操作,即使它仅输出到屏幕。
您可以使用 Windows 性能分析器来获取有关 pythonw.exe 正在执行的操作以及导致其等待的详细信息。
你可能希望查看我的回答这里。