1

我想运行作业,但由于它们可能很长,我想知道它们在执行过程中被处理了多远。也就是说,执行者会定期返回其进度,而不会结束它正在执行的作业。我曾尝试使用 APScheduler 执行此操作,但调度程序似乎只能接收事件消息,如 EVENT_JOB_EXECUTED 或 EVENT_JOB_ERROR。

在执行作业时是否可以从执行者那里获取信息?

提前致谢!

4

1 回答 1

0

我认为,APScheduler 对此没有特别的支持。这个要求对我提出了很多次,最好的解决方案将取决于你到底需要什么。一些可能性:

工作状态字典

最简单的解决方案是使用普通的 python 字典。将键设为作业的键,并将值设为您需要的任何状态信息。当然,如果每个作业只有一个副本同时运行 ( max_instances=1),则此解决方案效果最佳。如果你需要一些结构来处理你的状态信息,我是 namedtuples 的粉丝。然后,您要么将字典保留为邪恶的全局变量,要么将其传递给每个作业函数。

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

自定义字典

如果你需要一些额外的功能,你可以像上面那样做,但是子类 dict(或 UserDict 或 MutableMapping,取决于你想要什么)。

内存缓存

如果您有一个可以使用的 memcached 服务器,那么将状态报告存储在 memcached 中效果很好,因为它们可以自动过期,并且您的应用程序应该可以全局访问它们。一个可能是次要的缺点是,如果内存不足,状态信息可能会从 memcached 服务器中清除,因此您不能保证该信息可用。

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

别的东西

Pieter 关于使用回调函数的评论值得注意。如果您知道需要什么样的状态信息,但不确定最终将如何存储或使用它,那么将包装器传递给您的作业将使以后使用不同的后端变得容易。

不过,与往常一样,请警惕过度设计您的解决方案。如果您想要的只是一份显示“已处理 20/133 个项目”的报告,那么一个简单的字典可能就足够了。

于 2015-11-22T17:44:47.430 回答