跳转到主要内容

Django中的计划任务

项目描述

关于

django-future 是一个Django应用程序,用于在指定时间安排任务。

django-future 允许您在给定时间安排可调用对象的调用。作业队列存储在数据库中,可以通过管理界面进行管理。排队作业通过调用外部django管理命令来运行。

用法

您需要安装 django-future。最新版本应在PyPI上可用。

要从您的代码中安排作业,请使用 schedule_job 函数

>>> from django_future import schedule_job
>>> import datetime

>>> schedule_job(datetime.datetime(2010, 10, 10),
...              'myproject.myapp.handlers.dosomething')

运行作业

计划作业不会自动启动。作业队列必须定期通过调用Django管理命令 runscheduledjobs 来处理。您可能希望定期运行此命令,例如在cron作业中,以确保计划作业及时运行。

当作业处理器启动时,它会检查同时活动的作业处理器。如果发现任何活动作业,新的作业处理器实例将不会继续,并引发错误,因此您不需要担心并行作业运行的重叠。

每个任务都在独立的数据库事务中运行。如果处理程序抛出错误,则事务将回滚。

默认情况下,已完成任务的作业条目会被标记为完成,但不会从数据库中删除。如果您不想保留它们,请使用 -d 参数调用 runscheduledjobs,它们将在成功完成后被删除。

如果作业处理程序抛出错误,队列处理程序将中止并显示跟踪回溯。如果您在这种情况下不想中止处理,请使用 -i 参数。无论如何,如果发生异常,跟踪回溯将被存储在数据库中的作业条目上。

如果作业返回一个值,该值的Unicode表示也将存储在数据库中的作业条目上。

调度时间

有几种方式可以指示作业应该执行的时间。您可以使用直接的日期时间(如上所示),但您也可以指定相对于当前时间的偏移量。偏移量可以指定为时间差

>>> schedule_job(datetime.timedelta(days=5), 'myproject.myapp.x')

或字符串

>>> schedule_job('5d', 'myproject.myapp.x')

还可以指定一个过期时间(默认为一周),这样就不会意外地运行旧作业。

>>> schedule_job('5d', 'myproject.myapp.x', expires='7d')

过期日期是相对于预定时间计算的。

参数

您可以将参数传递给作业

>>> schedule_job('5d', 'myproject.myapp.x',
...              args=[1, 2], kwargs={'foo': 'bar'})

参数将被传递到可调用对象。请注意,参数必须是可序列化的。

您还可以将作业与数据库对象关联

>>> schedule_job('5d', 'myproject.myapp.x',
...              content_object=some_model_instance)

如果指定,内容对象将被作为第一个参数传递给可调用对象。

如果您使用 job_as_parameter 装饰处理程序,则活动作业将被作为参数传递。示例

>>> from django_future import job_as_parameter

>>> @job_as_parameter
... def handler(job):
...     do_stuff()

重新安排

某些作业可能需要重复执行。您可以通过在作业的处理程序中安排新的作业来实现这一点,但使用作业上的 reschedule 方法会更方便。 rescheduleschedule_job 具有相同的签名,但它会复制当前作业的属性。

>>> @job_as_parameter
... def handler(job, n=5):
...     do_something()
...     job.reschedule('3d', kwargs={'n': 6})

当您向 reschedule 传递相对时间值时,新预定时间是通过将偏移量添加到原始作业的 预定时间 而不是实际执行的时间来计算的。

反馈

有一个主页,其中包含有关如何访问代码存储库的说明。

将反馈和建议发送到 team@shrubberysoft.com

变更

0.2.3 版本的变更

0.2.2 版本的变更

(感谢 Jannis Leidel!)

  • 标记了用于翻译的字符串。

  • 添加了德语翻译。

  • 在作业正在运行的情况下,引发更友好的错误。

  • 使用管理字段集。

0.2.1 版本的变更

  • 修复了 start_scheduled_jobs 参数中的错误(感谢 Maciek Szczesniak)。

0.2.0 版本的变更

  • 存储作业返回的字符串值。

0.1.9 版本的变更

  • 在重新安排时,新日期是从当前作业的预定日期而不是实际运行开始计算的。

  • 正确实现了并发作业处理程序的检查。

  • 已过期作业的状态现在设置为“过期”。

0.1.8 版本的变更

  • 更新了管理界面:彩色状态、按日期筛选。

  • 重新使用了 django-picklefield 实现来存储作业参数,而不是自制序列化字段。

0.1.7 版本的变更

  • 现在,doctests 是源分布的一部分。

0.1.6 版本的变更

  • 一些包装和格式化更改。

0.1.5 版本的变更

  • 基本保护措施,防止并发作业处理器。

  • 增加了--ignore-errors选项。

0.1.4版本更改

  • 事务支持。

  • runscheduledjobs命令增加了-d选项。

  • 更好的测试覆盖率。

0.1.3版本更改

  • 修复了pickled字段实现。

  • 简化了作业重新调度。

0.1.1版本更改

  • 重命名为django-future

0.1版本更改

  • 首次公开发布。

由支持