休眠线程直到 Python 中的特定时间
Sleeping a Thread until certain time in Python
我写了一个脚本来创建线程,这些线程在发送电子邮件之前会自行休眠直到一天中的特定时间。有的运行在剧本当天下午4点运行,有的运行在第二天早上7点运行。
我的问题是,应该在下午 4 点 运行 的线程通常要到下午 5 点或 6 点才会 运行,而早上 7 点的线程总是 运行 准时.该脚本通常在上午 10 点至下午 1 点之间开始。我正在使用 Python 2.6.6
代码,简而言之,如下:
from datetime import datetime, timedelta
import threading
def main():
today = datetime.now()
today_at_4pm = today.replace(hour=16, minute=0, second=0)
tomorrow = today + timedelta(days=1)
tomorrow_at_7am = tomorrow.replace(hour=7, minute=0, second=0)
message = "some message"
threading.Thread(target=dispatchEmail, args=(message, today_at_4pm)).start()
threading.Thread(target=dispatchEmail, args=(message, tomorrow_at_7am)).start()
def dispatchEmail(message, time_to_send):
now = datetime.now()
if now < time_to_send:
time_diff = time_to_send - now
diff_in_seconds = (time_diff.days * 86400) + time_diff.seconds
sleep(diff_in_seconds)
sendEmail(message)
def sendEmail(message):
print message
if __name__ == '__main__': main()
我无法确定问题所在,因为它在发送时不一致,而且我在短时间内没有遇到任何问题 运行。此外 diff_in_seconds 计算似乎是准确的。
我认为错误在于睡眠部分或我对线程工作方式的误解。非常感谢任何帮助。
对于那些认为我应该分离脚本并使用 crontasks 的人 -- 我不想这样做,因为消息的实际内容是如何 read/tracked 来自文件的。
更新
我通过 python sched 文档找到了 threading.Timer 方法。这允许我在一段时间后 运行 该函数。我将睡眠时间计算移出了 dispatchEmail,这样我就可以摆脱它了:
def timeDifference(now, time_to_send):
if now < time_to_send:
time_difference = time_to_send - now
return (time_difference.days * 86400) + time_difference.seconds
else:
return 0
time_until_4pm = timeDifference(datetime.now(), today_at_4pm)
time_until_7am = timeDifference(datetime.now(), tomorrow_at_7am)
threading.Timer(time_until_4pm, sendEmail, (message))
threading.Timer(time_until_7am, sendEmail, (message))
我需要注意这方面的细微差别吗?
不要使用线程休眠。这绝对是解决问题的错误方法。如果你不想使用 crons(我假设你的意思是文字 linux cron 作业),使用像这样的东西 https://docs.python.org/2/library/sched.html
我写了一个脚本来创建线程,这些线程在发送电子邮件之前会自行休眠直到一天中的特定时间。有的运行在剧本当天下午4点运行,有的运行在第二天早上7点运行。
我的问题是,应该在下午 4 点 运行 的线程通常要到下午 5 点或 6 点才会 运行,而早上 7 点的线程总是 运行 准时.该脚本通常在上午 10 点至下午 1 点之间开始。我正在使用 Python 2.6.6
代码,简而言之,如下:
from datetime import datetime, timedelta
import threading
def main():
today = datetime.now()
today_at_4pm = today.replace(hour=16, minute=0, second=0)
tomorrow = today + timedelta(days=1)
tomorrow_at_7am = tomorrow.replace(hour=7, minute=0, second=0)
message = "some message"
threading.Thread(target=dispatchEmail, args=(message, today_at_4pm)).start()
threading.Thread(target=dispatchEmail, args=(message, tomorrow_at_7am)).start()
def dispatchEmail(message, time_to_send):
now = datetime.now()
if now < time_to_send:
time_diff = time_to_send - now
diff_in_seconds = (time_diff.days * 86400) + time_diff.seconds
sleep(diff_in_seconds)
sendEmail(message)
def sendEmail(message):
print message
if __name__ == '__main__': main()
我无法确定问题所在,因为它在发送时不一致,而且我在短时间内没有遇到任何问题 运行。此外 diff_in_seconds 计算似乎是准确的。
我认为错误在于睡眠部分或我对线程工作方式的误解。非常感谢任何帮助。
对于那些认为我应该分离脚本并使用 crontasks 的人 -- 我不想这样做,因为消息的实际内容是如何 read/tracked 来自文件的。
更新
我通过 python sched 文档找到了 threading.Timer 方法。这允许我在一段时间后 运行 该函数。我将睡眠时间计算移出了 dispatchEmail,这样我就可以摆脱它了:
def timeDifference(now, time_to_send):
if now < time_to_send:
time_difference = time_to_send - now
return (time_difference.days * 86400) + time_difference.seconds
else:
return 0
time_until_4pm = timeDifference(datetime.now(), today_at_4pm)
time_until_7am = timeDifference(datetime.now(), tomorrow_at_7am)
threading.Timer(time_until_4pm, sendEmail, (message))
threading.Timer(time_until_7am, sendEmail, (message))
我需要注意这方面的细微差别吗?
不要使用线程休眠。这绝对是解决问题的错误方法。如果你不想使用 crons(我假设你的意思是文字 linux cron 作业),使用像这样的东西 https://docs.python.org/2/library/sched.html