我的代码如下:
while True:
do things over the internet:
time.sleep(3600)
即使我的电脑已经睡着或者我没有登录,我希望time.sleep()
能够运行。例如,如果我启动程序,等待半个小时,注销(或让机器进入睡眠状态),一小时后再回来,我希望它再次运行并进入下一个周期的半个小时等待。
答案 0 :(得分:3)
你可以节省时间并每隔一分钟检查一次,例如(伪代码)
lastDone = None # Avoid unbound local errors
while True:
if lastDone is None or is_one_hour_ago(lastDone): # Write is_one_hour_ago()
# Do things
lastDone = time.now() # Not a real function yet
else:
sleep(600) # Sleep for a minute and check again
is_one_hour_ago
可能需要datetime模块,但是一旦你编写它就是相对简单的逻辑(如果现在减去一小时则返回True> = lastDone else False),你需要查看python的{ {1}}模块。或时间datetime
。
值得注意的是,在您的计算机睡眠时,解释程序无法运行,但是在您打开计算机后它会立即运行,并且除了睡眠之外它将是准确的。
答案 1 :(得分:1)
你应该看到,但是当你的机器进入睡眠状态时,time.sleep()可能会中断。
当其他一些事情发生时就会中断,比如KeyboardInterrupt。
因此,将sleep()放入try语句,并使用time.clock()或time.time()来查看sleep()中断和下一次循环继续之间经过多长时间以继续睡眠,或者只是让它打断:
try: time.sleep(360)
except: pass
因此,程序应该继续,没有任何错误。
但是,如果它不那么容易,你将不得不使用信号和/或服务管理来让操作系统通知你的进程它应该继续运行或启动睡眠程序(在注销意义上睡觉,而不是一个循环的实际睡眠。)
请参阅,当操作系统想要注销或关闭或进入睡眠状态时,它会以某种事件,信号或服务暂停的形式发送通知。 睡眠,有些具体,所有操作系统可能都不是这样。
你必须抓住这个并做一些有用的事情。
您通过信号模块管理的信号,
事件是系统特定的,可能很复杂。在Mac OS X上,它可以是AppScript或事件队列上的高级事件,也可以是MacPort消息,这会使事情复杂化,但API就在那里,不用担心。
在Windows上,您可能必须使用win32types winservice模块来创建有用的服务管理。
请注意,当操作系统关闭或注销时,它会向进程发送信号。如果流程没有响应并退出,它通常会询问用户是否应该退出,或者只是杀死流程。
因此,您必须相应地注册您的流程,它不会终止,即它必须是服务或守护程序。
要解决从睡眠模式返回的问题,最好使用threading.Timer()来完成你的工作。
这是一个线程,它将在指定时间后调用您注册的函数。
在启动守护进程之前将其更改为守护进程,并保留主循环以捕获事件或信号或其他任何内容。
当时间过去后,您的功能将会运行。然后你可以通知主循环停止其他处理并完成你的工作。
如果循环检测到从睡眠状态返回或登录,它可以直接调用您的函数并重新启动计时器。
当你掌握这一切时,很容易,不用担心。只是阅读很多。 :d
可能还有很多其他解决方案。
就像在登录时自动启动一些小过程,告诉你的过程应该做一些事情等等。现在一切都取决于你的创造力。