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

2 投票
1 回答
1859 浏览
提问于 2025-04-17 20:06

我找不到一个简单的例子,来说明如何在Python中安排一个事件。

我想要能够把一个日期和时间的字符串作为参数传递给一个函数。

比如说:

字符串:"m/d/Y HH:MM" 可以用来设置一个未来的函数在代码执行后运行。所以就像是一个函数在我运行它之后等待着去执行。

看起来主要的问题是如何正确格式化这个字符串,但一个简单的例子真的能帮助我理解如何“安排”一个函数去运行。

1 个回答

2

你没有提供足够的背景信息,让人理解你想要在更大的框架中做什么。不过一般来说,在Python中,“这不是它的工作方式”。

一个“普通”的Python程序是单线程的、同步的程序,它会一个接一个地执行任务,等所有任务完成后,程序就会退出,解释器也会随之退出。

所以,像这样(假设有一个虚构的“schedule”函数):

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

main()

在Python中是行不通的,因为如果调用schedule函数后立即返回,主函数就会退出,程序会尝试在main()调用后继续执行,然后终止。必须有一段代码持续运行,它可以计时、延迟,或者接收网络或用户生成的事件,并将这些事件分发给之前安排好的回调函数,这样程序才能继续运行。

这样一段可以计时并分发调用的代码,通常被称为“反应器”(reactor)——而在普通的Python程序中并没有这样的东西。与JavaScript程序不同,JavaScript环境(比如浏览器)默认就提供了这样的支持。

这就是为什么大多数Python的网络或网页框架,以及所有的GUI工具包,都会提供这样的核心功能——通常在主脚本的最后调用,方法或函数名为mainloopserve_foreverstart等等。从那时起,你的主脚本(已经设置好相应的回调、安排好任务等)就会停止运行——反应器将会是调用这些函数的那段代码。

我说你的问题缺少上下文,是因为一开始你只是想测试一些调度功能,但之后你会希望把它放在一个更大的系统中——这个系统应该使用适合你“真实任务”的框架来构建,比如如果是网页服务器系统,可以用Django、tornado、pyramid;如果是GUI程序,可以用gtk、Qt、Tk;如果是多媒体程序,可以用PyOgre、kivy、pyglet;如果是其他协议的通用网络服务器,可以用twisted,或者其他的东西,比如celery或camaelia——这些只是一些常见的例子。

话虽如此,Python的标准库确实提供了一个“通用”的调度函数——它实现了这样一个循环,具备基本的功能。如果你什么都不做,也不需要复杂的功能,它会在那儿阻塞,直到达到调用你安排的函数的时间,这时它会退出,并将控制权交回给你的主程序。如果你调用的函数又安排了其他事情,它会继续运行,依此类推。

可以查看文档和示例: http://docs.python.org/2/library/sched.html

你可以使用datetime模块中的函数来设置绝对时间,而不是使用time.time,正如你所要求的。还可以查看threading.Timer的文档——它在某种程度上可以做到你想要的,如果你想在给定的延迟后运行一个简单的函数,并且不想重写你的应用程序以基于事件运行——但尽管看起来简单,在更大的系统中会有很多缺点——你应该选择上面列出的框架之一。

撰写回答