Python 在处理计划作业时从该作业获取反馈

Python 在处理计划作业时从该作业获取反馈,python,job-scheduling,apscheduler,Python,Job Scheduling,Apscheduler,我想运行作业,但由于它们可能很长,我想知道它们在执行期间被处理了多远。也就是说,执行者会定期返回其进度,而不会结束正在执行的作业。 我曾尝试使用ApsScheduler执行此操作,但调度程序似乎只能接收事件消息,如执行的事件作业或错误事件作业 在执行作业时,是否可以从执行者处获取信息 提前谢谢 我认为,ApsScheduler中对此没有特别的支持。这个要求我已经提过很多次了,最好的解决方案将完全取决于你需要什么。一些可能性: 作业状态字典 最简单的解决方案是使用普通python字典。使键成为作业

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

在执行作业时,是否可以从执行者处获取信息


提前谢谢

我认为,ApsScheduler中对此没有特别的支持。这个要求我已经提过很多次了,最好的解决方案将完全取决于你需要什么。一些可能性:

作业状态字典 最简单的解决方案是使用普通python字典。使键成为作业的键,并使值成为您需要的任何状态信息。当然,如果每个作业只有一个副本同时运行(
max\u instances=1
),此解决方案效果最好。如果您需要一些状态信息的结构,我非常喜欢使用namedtuples。然后,要么将字典作为一个有害的全局变量保存,要么将其传递给每个作业函数

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

习惯用语 如果您需要一些额外的函数,可以如上所述,但子类是dict(或UserDict或MutableMapping,)

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

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

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


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

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

作业状态字典 最简单的解决方案是使用普通python字典。使键成为作业的键,并使值成为您需要的任何状态信息。当然,如果每个作业只有一个副本同时运行(
max\u instances=1
),此解决方案效果最好。如果您需要一些状态信息的结构,我非常喜欢使用namedtuples。然后,要么将字典作为一个有害的全局变量保存,要么将其传递给每个作业函数

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

习惯用语 如果您需要一些额外的函数,可以如上所述,但子类是dict(或UserDict或MutableMapping,)

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

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

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


不过,和往常一样,要小心过度设计您的解决方案。如果你想要的只是一份报告,上面写着“处理了20/133个项目”,那么一本简单的字典就足够了。

如果有一个大循环,你可以迭代一个表示工作进度的数字,然后打印出来。或者,如果你想要一些视觉化的东西,你可以用这个词作为画布的长度,作为你工作的进度条。我不知道你是否可以用一个模块而不是创建画布(或打印),但这种方法可以在不增加计算时间的情况下工作。@ysearka:执行器和计划程序如何访问相同的数字?执行器通常会锁定允许修改的每个对象。我是否必须为每个作业创建一个对象,该对象可以由执行器更新并由调度程序读取,然后要求调度程序定期检查该编号,或者是否有方法在每次更新编号时告知调度程序?如果显示最小的工作时间,可能会有所帮助