python - "ValueError: sleep length must be non-negative"在线程中

标签 python multithreading

下面的代码在一个线程中。该代码是从几年前在这里提出的问题的答案复制的(不幸的是我现在找不到这个问题)。虽然它对我来说看起来不错,但我收到一个错误:“ValueError: sleep 长度必须为非负数”。这种情况仅在大约一个小时左右后发生。难道它必须在 PC 进入休眠状态时执行某些操作(我认为不太可能,但它是一台运行 Windows 10 的笔记本电脑;-))。这是代码:

def upd_variables():
next_call = time.time()
while True:
    measured_temp = 19.5 # te wijzigen in uitlezing van de sensor
    acttemp.configure(text = str(measured_temp))
    humi = '49.5' # te wijzigen in uitlezing van de sensor
    humidity.configure(text = humi)
    actdaytime = datetime.datetime.now()
    today = actdaytime.strftime("%A %d %B %Y     %H:%M:%S")
    datumtijd.configure(text=today)
    if (measured_temp < desired_temp):
        #CV aan
        status.configure(text="CV aan")
    else:
        #CV uit
        status.configure(text="CV uit")
    next_call = next_call+1;
    time.sleep(next_call - time.time())

我希望这是可读的,我不确定代码块看起来像我想要的...... 顺便说一句:它是我正在开发的恒温器程序的一部分,旨在在 Raspberry Pi 上运行。

最佳答案

好吧,如果不是每个人都清楚的话。

这里的问题是,当你的计算机在循环中间休眠时,你的 next_call = next_call+1 会变旧,然后你减去 time.time() ,这取决于多少时间计算机的 sleep 时间可能会稍大一点或大很多(除非您的计算机 sleep 时间少于一秒)。

next_call = time.time() # Let's assume next_call=1
while True:
    ...
    # computer sleeps for 5 seconds
    next_call = next_call+1 # now next_call=2
    time.sleep(next_call - time.time()) # At this time, time.time() returns 6 (1 start + 5 sleeps) -> 2 - 6 = -4

有几个选项可以使其表现良好,第一个也是更简单的一个是添加一个 if 来检查 sleep 时间是否为负数。

关于python - "ValueError: sleep length must be non-negative"在线程中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35003699/

相关文章:

Python FTP 隐式 TLS 连接问题

python - AES 在 python 中加密 在 php 中解密

java - 使用多线程处理对 java 数组进行分区和分析

Java I/O 与带有 Linux NPTL 的 Java 新 I/O (NIO)

java - Future.cancel(true) 返回 true 但任务未取消

python - Python 子图中的作用域类似于 MATLAB 的 stackedplot()

python - 将数组的列作为列向量进行迭代

python - 如何删除图像周围的黑色矩形 Pygame

ios - 在当前队列上同步调度

python - FastAPI 和 Python 线程