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

Python CPU使用率降至0%,在脚本执行期间击键后恢复,python,windows,sleep,freeze,anaconda,Python,Windows,Sleep,Freeze,Anaconda,我的问题与此处发布的问题几乎相同: 该线程已停用多年,如果有不同的协议“重新打开”该问题,请提供建议-我在此同时发布此问题,如果我应该以不同方式执行此操作,我提前道歉 我不能发布代码,但这里有一些细节我可以分享-我正在执行一个脚本,其中包含许多迭代生成的print语句,以跟踪脚本执行所需数小时的进度。在任务管理器中监视我的CPU使用率时,我可以看到使用率周期性地下降到0%,并且只有在脚本运行的实际命令提示符中输入任何类型的键笔划时才会恢复 这发生在我的笔记本电脑和我尝试运行脚本的服务器上。操作

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

该线程已停用多年,如果有不同的协议“重新打开”该问题,请提供建议-我在此同时发布此问题,如果我应该以不同方式执行此操作,我提前道歉

我不能发布代码,但这里有一些细节我可以分享-我正在执行一个脚本,其中包含许多迭代生成的print语句,以跟踪脚本执行所需数小时的进度。在任务管理器中监视我的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

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

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


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

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