from twilio.rest import Client
from datetime import datetime
# Twilio Account SID, Auth Token
client = Client("SID", "Token")
while True:
if (datetime.time(datetime.now())) == '08:00:00.000000':
client.messages.create(to="+Number",
from_="+Number",
body="Goodmorning")
为什么不是每天早上 8 点执行?如果我从现在开始将其切换为一分钟并让循环运行它不起作用
答案 0 :(得分:2)
您的代码有两个错误的假设。
datetime.datetime.time(datetime.datetime.now())
的类型是 datetime.time,而不是 str,并且将 datetime.time 与 str 进行比较将始终返回 False。您应该将 datetime.datetime.time(datetime.datetime.now()) 与 datetime.time(8, 0) 进行比较。
第二个假设是 datetime.now 将在 08:00:00.000000 的确切时间执行,这是可能的,但不太可能。
修正第二个假设的一种方法是设置一个时间窗口,在此期间 if 语句可以为真。
from twilio.rest import Client
from datetime import datetime, timedelta, time, date
# Twilio Account SID, Auth Token
client = Client("SID", "Token")
# calculate the next time window
time_window_start = datetime.combine(date.today() + timedelta(days=1), time(8, 0))
time_window_end = time_window_start + timedelta(hours=1)
while True:
# check if we are in the time window
if time_window_start < datetime.now() and datetime.now() < time_window_end:
client.messages.create(
to="+Number", from_="+Number", body="Goodmorning")
# calculate new time window for tomorrow
time_window_start = datetime.combine(date.today() + timedelta(days=1), time(8, 0))
time_window_end = time_window_start + timedelta(hours=1)
这段代码会等到8点到9点之间,然后创建一条消息,等到第二天。 我仍然看到 3 个问题。首先是这是busy waiting。您可以通过使用 time.sleep 定期睡眠来解决此问题
<块引用>busy-waiting 或 spin 是一种技术,在该技术中,进程会反复检查某个条件是否为真。 ...在大多数情况下,旋转被认为是一种反模式,应该避免,因为可用于执行不同任务的处理器时间反而浪费在无用的活动上。在某些情况下,旋转可能是一种有效的策略。
第二个问题是您的代码可能会错过时间窗口。我已将窗口持续时间设置为 1 小时,所以我认为这不会经常发生。但有几种方法可以缓解这种情况。
第三个是窗口开始和结束在两个不同的地方计算。你可以把它放在一个函数中,这样你就Don't repeat yourself。
答案 1 :(得分:1)
使用您的代码,即使使用 maney 的答案,也无法正常工作。您的函数必须在 excatly '08:00:00.000000'
处随机调用才能使其正常工作。
看看这个question的答案。
答案 2 :(得分:0)
(datetime.time(datetime.now()))
返回值类似于对象 datetime.time(12, 18, 39, 515846)
。
您可以使用 datetime.time(datetime.now()).isoformat()
获取格式为 12:19:29.456461
的时间值。然后您可以使用它在您的 if
循环中进行比较。
例如,
from twilio.rest import Client
from datetime import datetime
# Twilio Account SID, Auth Token
client = Client("SID", "Token")
while True:
if (datetime.time(datetime.now())).isoformat() == '08:00:00.000000':
client.messages.create(to="+Number",
from_="+Number",
body="Goodmorning")