python - 等待使用 datetimenow 在 Python 3 中执行函数?
问题描述
我正在修补,datetimenow()
我想知道当有 2 个日期(现在和未来日期)时,你会如何“安排”一个函数的执行?
基本上我想在日期(和时间)不同时保持编程运行,但是当它是时,调用一些函数。
我的意思是:
from time import sleep
import time
import datetime
timenow = datetime.datetime.now()
future = datetime.datetime(2018, 8, 19, 15,28)
while timenow != future:
sleep(1.0)
if timenow == future:
'''calling some function'''
结果:
尽管指定future
的分钟数等于timenow
.
解决方案
您在这里有两个不同的问题,您需要同时解决这两个问题。
第一个问题是您永远不会timenow
在循环中更新。无论您的程序何时开始,这就是timenow
永远的价值。
要解决这个问题,您需要每次通过循环更新它:
while timenow != future:
sleep(1.0)
timenow = datetime.datetime.now()
第二个问题是,如果now
是,比如说,2018-08-19 15:27:59.123456
,那不等于2018-08-19 15:28:00.000000
。而一秒钟后,2018-08-19 15:28:00.131313
也不等于2018-08-19 15:28:00.000000
。当您每秒只检查一次时,您碰巧达到那微秒的机会大约有百万分之一。
要解决这个问题,只需使用<
而不是!=
:
while timenow < future:
sleep(1.0)
timenow = datetime.datetime.now()
现在,2018-08-19 15:27:59.123456
比您等待的时间还短——但2018-08-19 15:28:00.131313
事实并非如此。所以,你不要错过它。
当我们这样做时:
根本不需要那种if
说法。你只是在测试相反的while
条件。但是你能到达这里的唯一方法是while
条件为假,所以相反的条件总是为真,那么为什么还要检查它呢?
此外,如果您唯一使用timenow
的是该检查,您甚至不需要将其粘贴在变量中;直接打电话就行了now()
。
所以:
from time import sleep
import datetime
future = datetime.datetime(2018, 8, 19, 15,28)
while datetime.datetime.now() < future:
sleep(1.0)
'''calling some function'''
同时,真的没有理由一次睡一秒钟。为什么不只睡一次,直到future
?在某些版本的 Python 中,sleep
可以提前返回,所以你仍然需要一个while
循环,但你仍然可以这样做:
from time import sleep
import datetime
future = datetime.datetime(2018, 8, 19, 15,28)
while datetime.datetime.now() < future:
sleep((future - datetime.datetime.now()).total_seconds())
'''calling some function'''
大多数情况下,它只会睡一次——有时可能是两到三次——而不是一遍又一遍,所以它不会阻止你的笔记本电脑进入低功耗模式。
此外,它会在第二次醒来2018-08-19 15:28:00.987654
而不是(非常接近)第二次醒来的可能性要小得多。这对您的使用可能无关紧要,但如果它确实重要,那么在第二个醒来肯定是您想要的。
推荐阅读
- google-workspace-add-ons - 只需发送附加组件
- node.js - Express:如何检查请求是否来自 React Native 应用程序?
- c# - .NET 5 - 上传带有其他参数 API 的文件
- r - 在 R 中重新排列数据框 - 将唯一的重复值合并到行中
- scala - Scala - Quicklens 枚举
- python - 在多节点集群中跨 H2O 节点分配资源
- android - Android中以下值的简单日期格式
- javascript - Webpack 显示重复的控制台日志
- javascript - 使用 pdfjs 动态突出显示 PDF 文本
- reactjs - 如何在reactjs的配置文件URL中传递用户名?