【问题标题】:Is there a way to run a separate looping worker process that references a Django app's models?有没有办法运行引用 Django 应用程序模型的单独循环工作进程?
【发布时间】: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


【解决方案1】:

您可以尝试编辑代码,以便专门处理电子邮件的部分不会在 django 模型中如此固有地尝试,这样 django 模型和此辅助应用程序都与标准 python 类/模块/对象/交互等等,而不是试图在其他地方移植你需要的 django 部分。

或者,如果您的应用实际上在一个解释器中使用线程来防止发送多条消息,您可以尝试使用 threading.Lock 之类的东西。还有一个multiprocessing.Lock,如果线程没有,它可能会起作用。

另一种选择是使每个请求的更改都具有唯一的值,最好是基于更改本身的内容。 IE 如果你有类似的东西:

def check_send_email(email_addr, website_url, text_that_changed):
    database.query('INSERT INTO website_updates VALUES %s, %s', (website_url, text_that_changed,))

    if (database.check_result()):  # update was not already present in database
        send_email(email_addr)

check_send_email('email@example.com', 'website.com', '<div id="watched-div">')

显然,您需要与一些更具体的工具进行交互,但上面的总体思路是,如果收到请求,您不会不必要地发送多封电子邮件。当然,在给定特定更改的情况下,找到一个始终可以生成完全相同但每次都唯一的值可能会很困难。

【讨论】:

    猜你喜欢
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-09
    • 2017-11-06
    • 2012-07-06
    • 2020-07-15
    相关资源
    最近更新 更多