Python 是否有方法运行引用Django应用程序的单独循环工作进程';什么样的型号?

Python 是否有方法运行引用Django应用程序的单独循环工作进程';什么样的型号?,python,django,multithreading,heroku,Python,Django,Multithreading,Heroku,我有一个webapp,可以监控用户添加的站点的任何更改。要做到这一点,我需要有一些独立的后台线程/进程,不断地在站点列表中迭代,一次ping一个站点,并通过电子邮件发送任何正在监视站点变化的用户。我目前正在使用一个在URL.py文件末尾初始化的线程。这在Django的开发服务器上运行良好,但一旦我使用Gunicorn将其部署到Heroku,它就开始崩溃。一旦有多个连接,就会启动工作线程的多个副本,因为Gunicorn会启动更多的工作线程来处理并发连接(至少,我认为这就是额外线程背后的原因)。这会

我有一个webapp,可以监控用户添加的站点的任何更改。要做到这一点,我需要有一些独立的后台线程/进程,不断地在站点列表中迭代,一次ping一个站点,并通过电子邮件发送任何正在监视站点变化的用户。我目前正在使用一个在URL.py文件末尾初始化的线程。这在Django的开发服务器上运行良好,但一旦我使用Gunicorn将其部署到Heroku,它就开始崩溃。一旦有多个连接,就会启动工作线程的多个副本,因为Gunicorn会启动更多的工作线程来处理并发连接(至少,我认为这就是额外线程背后的原因)。这会导致发送重复的电子邮件,每个线程发送一封

我现在正试图找到另一种生成这个工作线程/进程的方法。我看到一个类似的查询,但当我尝试发布的解决方案时,我无法从我的Django应用程序中引用模型,并在尝试这样做时收到此错误消息:

django.core.exceptions.AppRegistryNotReady:尚未加载应用程序。


我还尝试过使用
django后台任务
,对于类似这样的问题,这经常被推荐为一种简单的解决方案。然而,它似乎不适合循环、连续的过程。芹菜和其他类似的解决方案也是如此。我只是在寻找一种方法来启动一个单独的worker Dyno,它在后台连续运行,没有队列或类似的东西,并且能够使用我的Django应用程序中的模型来创建可以迭代的查询集。做这样的事情最好的方法是什么?请让我知道是否有更多的信息会有所帮助。

您可以尝试编辑代码,以使专门处理电子邮件的部分不会在django模型中进行固有的尝试,从而使django模型和此辅助应用程序与标准python类/模块/对象/等交互,而不是试图把你需要的django的部分移植到别处

或者,您也可以尝试使用类似于“如果您的应用程序实际上在一个解释器中使用线程来阻止多条消息发送”的方法。如果穿线装置不起作用,也有一个可能起作用的装置

另一种选择是使每个请求的更改都具有唯一的价值,最好是基于更改本身的内容。例如,如果您有以下情况:

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">')
def check\u send\u email(电子邮件地址、网站url、更改的文本):
database.query('INSERT-INTO-website_更新值%s,%s',(website_url,text_更改,))
if(database.check_result()):#数据库中尚未存在更新
发送电子邮件(电子邮件地址)
检查并发送电子邮件('email@example.com“,”website.com“,”)

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

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

或者,您也可以尝试使用类似于“如果您的应用程序实际上在一个解释器中使用线程来阻止多条消息发送”的方法。如果穿线装置不起作用,也有一个可能起作用的装置

另一种选择是使每个请求的更改都具有唯一的价值,最好是基于更改本身的内容。例如,如果您有以下情况:

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">')
def check\u send\u email(电子邮件地址、网站url、更改的文本):
database.query('INSERT-INTO-website_更新值%s,%s',(website_url,text_更改,))
if(database.check_result()):#数据库中尚未存在更新
发送电子邮件(电子邮件地址)
检查并发送电子邮件('email@example.com“,”website.com“,”)

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

celerybeat任务可以完成这一点。为什么你认为它不合适?据我(承认有点有限)的理解,芹菜周期性任务或重复的
django后台任务
任务会像crontab一样每天在固定的时间运行。但是,我正在尝试在周期之间不延迟地不断ping站点(即迭代所有站点的QuerySet,刷新QuerySet,然后再次执行)。此外,由于站点的数量可能会发生变化,因此以固定的时间间隔运行任务将不起作用。然而,我可能误解了芹菜文档。如果是这样的话,我很抱歉。一个celerybeat任务可以完成这个任务。为什么你认为它不合适?据我(承认有点有限)的理解,芹菜周期性任务或重复的
django后台任务
任务会像crontab一样每天在固定的时间运行。但是,我正在尝试在周期之间不延迟地不断ping站点(即迭代所有站点的QuerySet,刷新QuerySet,然后再次执行)。此外,由于站点的数量可能会发生变化,因此以固定的时间间隔运行任务将不起作用。然而,我可能误解了芹菜文档。如果是这样的话,我很抱歉。