我编写了一个Django应用程序,用于处理显示基于URL中传递的主键的模型数据的网页,这一切都正常,Django组件在大多数情况下工作正常。
我的问题是,我已经尝试了多种方法,比如使用AppConfig,我是如何做到这一点的,当Django服务器启动时,代码被调用,然后创建一个单独的线程,然后监视外部source,将来自该源的有效数据作为模型记录到数据库中。
我将线程代码与创建模型的部分一起编写并将其保存在数据库中,但我的问题是,如果我尝试使用AppConfig来创建随后会处理代码的线程,我会得到一个django.core.exceptions.AppRegistryNotReady:尚未加载应用。错误,服务器无法启动。
放置代码的位置是什么?我的方法不正确吗?
答案 0 :(得分:4)
尝试使用线程来绕过像Web服务器这样的阻塞进程是一种痛苦的练习。我以前做过它而且它很脆弱,往往会产生无法预测的结果。
更容易的想法是创建一个单独的工作程序,该工作程序在完全不同的进程中运行,您可以单独启动。它具有相同的数据库访问权限,甚至可以使用您的Django模型。这就是像Heroku这样的主机如何解决这个问题。它还具有额外的好处,即能够单独进行测试,并且在您处理主Django应用程序时根本不需要运行。
目前,有很多虚拟化选项,如Vagrant和容器化选项,如Docker,运行并行流程和工作人员是微不足道的。在野外,它们可能在另一台服务器上与您的数据库在不同的服务器上运行。正如评论中提到的,可以轻松地将启动工作进程委派给单独的Django management command。反过来,这可以很容易地通过您的Web服务器上的gunicorn变成单独的工作进程。