如何在 Django 中动态调度任务?

Posted

技术标签:

【中文标题】如何在 Django 中动态调度任务?【英文标题】:How to dynamically schedule tasks in Django? 【发布时间】:2017-09-29 17:04:42 【问题描述】:

我需要在 Django 中构建一个应用程序,让用户每天在运行时指定的时间执行一些任务。

我看过 Celery,但找不到任何有用的东西。我找到了 apply_async,我可以让任务在指定的持续时间内执行一次,但不会重复执行。我错过了一些东西,但不知道是什么。

请建议我怎样才能做到这一点。

【问题讨论】:

嗨卡马尔,你做到了吗?如果是这样,请告诉我你是如何实现的。提前致谢。如果您能帮助我,我们将不胜感激。 【参考方案1】:

django-celery-beat 包允许您动态地将任务添加到数据库中,然后按照您在数据库中定义的方式执行它们。(例如每 5 分钟一次)但是目前它们存在导致该任务未附加到 celery 队列的错误添加到数据库时。一种建议的解决方法是在每次添加新任务时重新启动 celery 进程。 我用 Dan Baders schedule 包解决了这个问题。我每分钟安排一次任务,检查数据库中需要在当前分钟执行的任务。然后我在新线程中启动每个任务。 希望这会有所帮助。

【讨论】:

谢谢,Django-Celery-beat 似乎是我正在寻找的东西,日程包似乎也很有希望,但我需要一些与 Django 集成的东西。我会检查错误是否已修复。 上周我检查过,而我需要的和你完全一样。如果您需要,我可以将我的解决方案的代码 sn-p 与 schedule 包共享给您。那你能把它标记为接受吗? 是的,确定该解决方案是否对我有帮助。【参考方案2】:

Advanced Python Scheduler 可能是适合您的解决方案。

https://github.com/agronholm/apscheduler

https://apscheduler.readthedocs.io/en/latest/

APScheduler 可以动态添加作业。

您可以查看我的 github 示例: https://github.com/easytrader/Apscheduler_for_django/blob/master/trips/views.py

【讨论】:

【参考方案3】:

一个简单的解决方案,可以防止使用繁重的 AMQP 堆栈,防止像 Celery 这样的外部依赖,你可以做的一件事是你可以写一个 custom management command,

python manage.py my_daily_cmd

如果您使用的是 Windows,请使用 cron, 如果您使用的是 Windows,请使用 at 或 schtasks.exe,

使用 cron/at/schtasks.exe,您可以在所需时间运行 my_daily_cmd

【讨论】:

我需要用户能够安排任务,谢谢。【参考方案4】:

我认为django-crontab 对你来说是一个很好的解决方案。

【讨论】:

感谢@ikreb,但似乎我需要在 settings.Py 中硬编码时间,但我需要根据用户输入动态设置它们。 好吧,也许这不是最好的解决方案,但是您可以每分钟运行一个 cronjob 来检查是否有用户任务。 是的,每分钟检查一次似乎是合理的,谢谢。【参考方案5】:

Celery 和 cron 的替代方案是 python-rq 和 rq-scheduler。

【讨论】:

@KamalSingh 以我的经验,它是可靠的,并且比设置 Celery 涉及的设置和选择更少:)

以上是关于如何在 Django 中动态调度任务?的主要内容,如果未能解决你的问题,请参考以下文章

重试丢失或失败的任务(Celery、Django 和 RabbitMQ)

Celery Beat 调度程序不会在 Django 中执行我的任务

动态规划:任务调度问题(双塔问题)

Django + Celery:如何将带有参数的任务链接到周期性任务

芹菜任务没有注册?

Django 高并发负载均衡