【发布时间】:2020-07-11 03:18:14
【问题描述】:
我有一个 web 应用程序,可以监控用户添加的网站是否有任何更改。为此,我需要有某种单独的后台线程/进程,它不断地遍历站点列表,一次 ping 它们一个,并通过电子邮件向正在监视更改的站点的任何用户发送电子邮件。我目前正在使用我在 urls.py 文件末尾初始化的线程。这适用于 Django 的开发服务器,但是一旦我使用 Gunicorn 将它部署到 Heroku,它就会开始崩溃。一旦有多个连接,工作线程的多个副本就会启动,因为 Gunicorn 会启动更多工作线程来处理并发连接(至少,这就是我认为额外线程背后的原因)。这会导致发送重复的电子邮件,每个线程发送一封。
我现在正在尝试寻找另一种方法来生成这个工作线程/进程。我看到了类似的查询here,但是当我尝试发布的解决方案时,我无法从我的 Django 应用程序中引用模型,并在尝试这样做时收到此错误消息:
django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
我也尝试过使用django-background-tasks,它经常被推荐为此类问题的简单解决方案。但是,它似乎不适合循环、连续的过程。 Celery 和其他类似的解决方案也是如此。我只是在寻找一种方法来启动一个单独的工作人员 Dyno,它在后台连续运行,没有队列或类似的东西,并且能够使用我的 Django 应用程序中的模型来创建可以迭代的查询集。做这样的事情的最好方法是什么?如果有更多信息有帮助,请告诉我。
【问题讨论】:
-
一个 celerybeat 任务可以完成这个。为什么你觉得不合适?
-
就我(诚然有些有限)的理解而言,Celery 定期任务或重复的
django-background-tasks任务将在每天设定的时间运行,就像 crontab 一样。但是,我试图不断地在周期之间不延迟地 ping 站点(即遍历所有站点的 QuerySet,刷新 QuerySet,然后再做一次)。此外,由于站点的数量可能会发生变化,因此以某个恒定的时间间隔运行任务将不起作用。但是,我可能误解了 Celery 文档。如果是这种情况,我深表歉意。
标签: python django multithreading heroku