【问题标题】:Datetime object switches values during while loop interationsDatetime 对象在 while 循环迭代期间切换值
【发布时间】:2020-07-31 00:05:45
【问题描述】:

我在我的 Python 代码中看到了这个奇怪的问题,但不太清楚发生了什么。如此快速的代码背景故事,我有一个函数,我的 UI 脚本在启动时调用它在单独的线程中运行。该线程旨在调用单独模块中的函数,该函数检查数据库中存储的时间戳是否早于 x_value,如果是,则执行操作。

所以这是函数(如果需要,我可以稍后发布更多代码,但这个函数是问题发生的地方):

def tableUpdateCheck(sensor_manager):
    last_check = datetime.now()
    print(f"last_check: {last_check.strftime('%m/%d/%Y_%H:%M:%S')}")

    while RUN_TABLE_UPDATE_THREAD:
        print(f"Now: {datetime.now().strftime('%H:%M:%S')}\tLast check time: {last_check.strftime('%H:%M:%S')}")
        if datetime.now() - last_check > timedelta(seconds=60):
            print('Running update table update check...')
            sensor_manager.updateTables()
            last_check = datetime.now()

        time.sleep(5)

if __name__ == '__main__':
    sensor_mgr = SensorManager()
    table_thread = Thread(target=tableUpdateCheck, args=[sensor_mgr])
    table_thread.start()
    # Start webserver stuff

生成的输出如下所示:

Now: 17:49:13   Last check time: 17:49:13
Now: 17:49:18   Last check time: 17:49:10
Now: 17:49:23   Last check time: 17:49:13
Now: 17:49:28   Last check time: 17:49:10
Now: 17:49:33   Last check time: 17:49:13
Now: 17:49:38   Last check time: 17:49:10

并继续这样做,直到 if 语句运行,并且“last_check”返回到在两个值之间波动。

对这可能的原因有什么想法吗?它不会阻止整个程序最终完成它应该做的事情,但它非常烦人。

【问题讨论】:

  • 您同时在两个单独的线程中运行该函数。在您的代码中搜索对 tableUpdateCheck 的其他引用。
  • 整个代码中只有一个地方调用了这个函数。除了函数定义之外,唯一提到它的地方是 Thread 对象被实例化并将函数作为目标传递的地方。我回去仔细检查了代码以确定。
  • 这与threading有关吗?我的意思是,如果你不在线程中运行函数,你是否检查过你是否得到了预期的行为?
  • @MrFuppes 我确实怀疑它与线程有关,但我不确定它是如何做的,并希望在这里深入了解它。不过,要回答您的问题,不,我没有尝试自行运行它。当我有机会并更新结果时,我会这样做。

标签: python datetime


【解决方案1】:

因此,对于将来可能偶然发现此问题的任何人,事实证明 Flask 应用程序中的“app.run_server(debug=True)”会导致一个额外的线程在启动时运行。我不是 100% 为什么会出现这种情况,但这似乎是导致我所描述的问题的原因。

但是,使用生产 Flask 应用程序,或者只是在开发服务器上将“调试”参数设置为 False 将不会启动多个线程,这个问题就会消失。

【讨论】:

    猜你喜欢
    • 2017-12-14
    • 1970-01-01
    • 2017-12-07
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    相关资源
    最近更新 更多