在Python中,怎么让线程睡眠直到特定时间?

58 投票
16 回答
112810 浏览
提问于 2025-04-15 17:48

我知道我可以让一个线程暂停一段特定的时间,方法是:

time.sleep(NUM)

那么,我该如何让一个线程一直睡到凌晨2点呢?我是不是需要计算一下到凌晨2点还有多少秒?或者有没有什么库函数可以直接用?

(是的,我知道有cron和Windows中的类似系统,但我想在Python中让我的线程自己睡觉,而不是依赖外部的刺激或进程信号。)

16 个回答

11

这是一个稍微更通用的解决方案(基于Ross Rogers'的内容),如果你想要添加分钟的功能,可以参考这个。

import datetime
import time

def sleepUntil(hour, minute):
    t = datetime.datetime.today()
    future = datetime.datetime(t.year, t.month, t.day, hour, minute)
    if t.timestamp() > future.timestamp():
        future += datetime.timedelta(days=1)
    time.sleep((future-t).total_seconds())

请注意,这个方法会大致在指定的时间之前“睡眠”,但可能会有一些超出预期的情况(根据我自己的实验,有时候会比设定的“睡眠到”时间多出大约400毫秒)。如果你需要精确到毫秒的“睡眠”(少于10毫秒),我建议使用pause模块,正如Bobby所建议的那样。

47

你可以使用一个叫做 pause 的工具包,特别是里面的 pause.until 这个功能,来实现这个目的:

import pause
from datetime import datetime

pause.until(datetime(2015, 8, 12, 2))
50

这里有个不太完整的解决方案,它没有考虑到时钟抖动或时钟的调整。可以查看评论,里面有一些方法可以解决这些问题。

import time
import datetime

# if for some reason this script is still running
# after a year, we'll stop after 365 days
for i in xrange(0,365):
    # sleep until 2AM
    t = datetime.datetime.today()
    future = datetime.datetime(t.year,t.month,t.day,2,0)
    if t.hour >= 2:
        future += datetime.timedelta(days=1)
    time.sleep((future-t).total_seconds())
    
    # do 2AM stuff

撰写回答