Python CPU 使用率降至 0%,在脚本执行期间击键后恢复

Posted

技术标签:

【中文标题】Python CPU 使用率降至 0%,在脚本执行期间击键后恢复【英文标题】:Python CPU usage drops to 0%, resumes after keystroke during script execution 【发布时间】:2015-10-28 16:54:39 【问题描述】:

我的问题与此处发布的问题几乎相同:

Python sleeps until keystroke

该线程多年来一直处于非活动状态,如果有“重新打开”问题的不同协议,请告知 - 我同时发布这个问题,如果我应该这样做,我提前道歉不同。

我无法发布代码,但这里有一些我可以分享的细节 - 我正在执行一个脚本,其中包含许多迭代生成的打印语句,以跟踪脚本执行所需的几个小时内的进度。在任务管理器中监视我的 CPU 使用率时,我可以看到使用率定期下降到 0%,并且只有当我在脚本运行的实际命令提示符中输入任何类型的键击时才会恢复。

这发生在我的笔记本电脑和我尝试运行脚本的服务器上。操作系统是 Windows 8.1 和 Windows Server 2012r2,我使用的是 Anaconda 2.2 和 Python 3.4.3。我使用的唯一非标准 python 库是 pandas 0.15.2、numpy 1.9.2、statsmodels 0.6.1 和 scikit-learn 0.16.1。

我不确定我是否可以确定这是否总是发生在特定行,但我会尝试 - 如果可以的话,我可能可以将其追踪到我正在使用的特定包?如果有人有任何想法可能导致这样的事情,请分享,否则任何关于如何自行解决此问题的建议将不胜感激。

更新:我运行了以下代码来尝试重现错误:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm
from sklearn.linear_model import LogisticRegression
from datetime import datetime

num_rows = 1000
i = 1

t_init = datetime.now()
while True:
    with open('temp_stage_1.txt','w') as file:
        file.write('current stage 1 iteration number: %d' % i)

    X = np.random.randint(2, size=(num_rows,25))
    y = np.random.randint(2, size=num_rows)

    with open('temp_stage_2.txt','w') as file:
        file.write('current stage 2 iteration number: %d' % i)

    clf = LogisticRegression()
    clf.fit(X,y)
    clf.score(X,y)

    with open('temp_stage_3.txt','w') as file:
        file.write('current stage 3 iteration number: %d' % i)

    logit = sm.Logit(y,X)
    results = logit.fit(disp=False)

    with open('temp_stage_4.txt','w') as file:
        file.write('current stage 4 iteration number: %d' % i)

    for j in range(10000):
        waste_time_str = 'wasting some time'

    if i % 1000 == 0:
        t_now = datetime.now()
        t_delta = (t_now-t_init).seconds
        t_init = t_now
        print(t_delta)
        print(i) 

    i += 1

我能够重现错误,通过打开创建的临时文件,我可以看到错误发生在第 26000 次迭代更新第 4 个临时文件之后。我第二次运行它,根据第四个临时文件,错误发生在另一个 1000 的倍数上。另一个有趣的观察是,在我击键并恢复执行后,打印出来的时间增量反映了它坐在那里等待的时间。这也与我看到此错误的原始脚本一致,但是,在那种情况下,它只打印了看似正常的时间范围,所以我知道错误发生在分配时间值之后。在这两种情况下,错误似乎都发生在其中一个打印语句中。

【问题讨论】:

我们可能不需要您的确切代码,但如果有重复问题的代码会很有帮助。 你有没有同时运行的其他python脚本?因为在 python 中有 GIL(全局解释器锁)“防止多个本机线程同时执行 Python 字节码”(wiki.python.org/moin/GlobalInterpreterLock)。因此,可能存在某种类型的竞争条件,当您键入键盘时,该 python 进程在 cpu 上的优先级突然提高并再次开始计算。请注意,threading.thread(s) 也受 GIL 约束。 我在交互式解释器中看到了这种情况——我将照常进行,然后我输入一个语句,直到我输入一个键时才会发生任何事情。其他语句可以正常工作,但是如果没有击键,那个特定的语句就不会继续。我不知道是什么原因造成的,但关闭解释器并打开一个新解释器似乎可以解决它。然后我可以毫无问题地执行有问题的语句。 @Kupiakos 我将尝试编写一些通用代码来重现该问题。 @jumojer 我确实在脚本执行时运行了其他 python 实例。在任何给定时间,我都可以打开多个 IPython 会话或 IPython 笔记本做各种事情。如果我不能这样做会有些问题,但如果这是问题,那么也许我可以找到解决方法。 【参考方案1】:

您很可能会意外进入“快速编辑模式”(通过在 Windows 终端中选择一些文本)。快速编辑模式会阻止任何打印到控制台,直到您离开它(通过按键),这与您看到错误发生在其中一个打印语句中是一致的。

有关更多详细信息,请参阅this post(不是特定于 python)。

【讨论】:

以上是关于Python CPU 使用率降至 0%,在脚本执行期间击键后恢复的主要内容,如果未能解决你的问题,请参考以下文章

为啥 cpu 性能计数器一直报告 0% cpu 使用率?

Python脚本分析CPU使用情况

python脚本的CPU使用率

python 绑定进程在某个cpu上执行 affinity

睡眠如何消耗 CPU php [关闭]

htop 报告 100% cpu 窃取时间,在 virsh restore 后 top 报告 0%