如何在 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 中执行我的任务