2015-06-25 22 views
1

我想运行作业,但由于它们可能很长,我想知道它们在执行过程中的处理程度。也就是说,执行者会定期返回进度,而不会结束正在执行的工作。 我试图用APScheduler做到这一点,但似乎调度器只能接收像EVENT_JOB_EXECUTED或EVENT_JOB_ERROR这样的事件消息。从预定作业处理过程中获得反馈

在执行器执行任务时,是否可以从执行器获取信息?

在此先感谢!

+0

如果存在大循环,则可以迭代代表工作进度并打印的数字。或者,如果你想要一些可视化的东西,你可以用这个词作为画布的长度,作为你作品的进度条。 我不知道你是否可以用模块来做,而不是创建画布(或者打印),但是这种方式在不增加太多时间的情况下运行。 – ysearka

+0

@ysearka:执行者和调度器如何访问相同的数字?执行者通常锁定每个允许修改的对象。我是否必须为每个作业创建一个对象,可以由执行者更新并由调度器读取,然后让调度员定期检查该号码,或者每次更新号码时都有办法告诉调度员? – petibonum

+0

如果您显示一个最小的工作示范代码,它可能会有所帮助。 [ask] – boardrider

回答

0

我认为,在APScheduler中没有特别的支持。这个要求对我来说很多次了,最好的解决方案将取决于你的需求。一些可能性:

工作状态字典

最简单的办法是使用一个普通的Python字典。把关键作为工作的关键,并确定你需要的任何状态信息的价值。当然,如果您只同时运行每个作业的一个副本(max_instances=1),则此解决方案效果最佳。如果你的状态信息需要一些结构,那么我就是一个namedtuples的粉丝。然后,你要么将字典保存为一个邪恶的全局变量,要么将它传递给每个工作函数。

虽然有一些缺点。状态信息将永远保留在字典中,除非您删除它。如果在工作结束时将其删除,则无法读取“工作完成”状态,否则必须确保无论监视状态如何,都必须检查并清除每项工作。当然,如果您拥有合理大小的一组作业/键,这当然不是什么大问题。

自定义字典

如果你需要一些额外的功能,您可以按上述做,但子类字典(或UserDict中或MutableMapping,depending on what you want)。

Memcached的

如果你有,你可以使用memcached服务器,存储在memcached中的状态报告的伟大工程,因为它们可以自动过期,他们应该是你的应用程序全局访问。一个可能的小缺点是,如果内存不足,状态信息可能会从memcached服务器中逐出,因此您无法保证信息可用。

一个更主要的缺点是,这确实需要你有一个memcached服务器可用。如果您可能有或没有可用的,则可以使用dogpile.cache并选择当时适合的后端。

别的东西

彼得的有关使用回调函数的评论是值得考虑的注释。如果你知道你需要什么样的状态信息,但是你不知道最终如何存储或使用它,将封装器传递给你的工作将使后面使用不同的后端变得容易。

尽管如此,请谨慎对待您的解决方案。如果你想要的是一个报告说“20/133项目处理”,一个简单的字典可能就足够了。