使用python sched模块和enterabs使函数在特定时间运行

时间:2013-03-24 03:47:01

标签: python scheduler

我似乎无法找到一个如何在Python中安排事件的简单示例。

我希望能够将日期和时间字符串作为参数传递给函数。

例如:

字符串:“m / d / Y HH:MM”将在代码执行后设置将来函数运行的时间。所以,就像我运行它之后等待关闭的功能一样。

似乎主要的问题是正确格式化字符串,但一个简单的例子真的有助于了解如何“安排”运行的函数。

1 个答案:

答案 0 :(得分:2)

你没有提供足够的背景来理解你想要在更大的框架中做什么 - 但是,一般来说 - “这不是它的工作原理”。

“普通”Python程序是一个单线程的同步程序 - 它将运行一个任务,一个又一个,一个接一个地完成所有任务,程序退出,并且解释器随之退出。

所以,(带有虚构的“日程安排”功能):

def main():
    print("Hello World")
    schedule(60, main)

main()

在Python中不起作用,如果调度调用立即返回 - 主函数将退出,程序将尝试在main()调用后恢复,并终止。需要运行一段代码,可以计算时间和延迟,可能接收网络或用户生成的事件,并将它们分派给先前安排的回调函数,以便程序继续运行。

这样一段代码,可以解释时间和调度调用,通常称为“反应堆” - 并且没有一个在普通的Python程序中运行。例如,在JavaScript程序中,浏览器或其他JavaScript环境默认提供此类托管。

这就是为什么大多数Python Web或网络框架,所有GUI工具包都提供了这样的核心 - 它通常在一个main脚本的末尾调用,并且是一个名为mainloop或{{1的方法或函数},serve_forever等等。从那时起,您的主脚本已经设置了相应的回调,计划的事情等等,停止 - 反应堆将成为调用事物的代码段。

这就是我说你的问题错过了你想要做的事情的背景:首先你只想测试一些调度 - 但之后你会想要在一个更大的系统中 - 这个系统应该使用适当的框架构建为你的“真正的任务”,例如Django,龙卷风,金字塔,如果它是一个网络服务器系统,gtk,Qt,Tk如果它是一个GUI程序,PyOgre,kivy,pyglet如果它是一个多媒体程序,扭曲为另一个协议的通用网络服务器,或其他东西,如芹菜或camaelia - 这些只是一般的例子。

也就是说,Python的标准库确实提供了“通用”调度程序功能 - 它确实实现了这样一个循环,具有功能的核心。如果你什么也没做,而且没什么特别的,它会阻塞那里直到它到达调用你的预定功能的时间,此时它将退出,并恢复对你的主程序的控制。如果被叫函数安排其他事情,它将继续运行,依此类推。

请参阅以下文档和示例: http://docs.python.org/2/library/sched.html

您可以使用datetime模块中的函数而不是time.time来设置r绝对时间。还要检查那里的文档到threading.Timer - 如果你想在给定的延迟之后运行一个简单的函数,与其他任何正在运行的代码并行运行,那么它可以以一种天真的方式做你或多或少的事情。我想重写你的应用程序是基于事件的 - 但是它看起来更简单,它在更大的系统中会有许多缺点 - 你应该选择一个列出的框架。