2

我有一个 Django 应用程序,它需要访问受 API 密钥速率限制的 Web API。为了管理对 API 的请求,我创建了一个简单的后台服务器,它轮询我的 Django ORM 以获取排队的任务请求,并相对于我的应用服务器异步执行它们(应用服务器不需要阻塞结果)。工作服务器使用自定义的 manage.py 命令启动。这些外部查找的处理要求非常低,所以我想直接从我的主 Web 服务运行它们。我已经用一个临时的互斥锁来操纵它,这样当我的应用程序扩展时,这些工作服务器中只有一个会运行。

我试图找出在部署应用程序时自动启动此工作服务器的最佳方法。我尝试将它作为命令添加到我的 supervisord.conf 文件中,但失败并出现错误ImportError: No module named django.core.management。我认为这是因为 supervisord 没有在安装 Django 的虚拟环境中运行。因此,我尝试从postinstall钩子中运行一个单独的 supervisord 副本。这导致我的部署失败,因为postinstall在终止之前等待所有命令完成,并且它正在超时。

有没有办法修复这些方法中的任何一种,或者另一种可能有效的方法?在我看来,即使我确实创建了一个单独的python-worker服务,我也会遇到类似的问题。

4

1 回答 1

2

将其放入supervisord.conf. 您为什么会收到关于找不到 Django 的错误也是正确的。幸运的是,这是一个简单的修复。

您只需要确保manage.py使用正确的 python 二进制文件(virtualenv 内部的那个)调用您的 django,它应该适合您。

这是一个使用完全限定路径的示例,以确保我们使用的是正确的文件。除非您的应用程序也被调用myapp,否则您的 manage.py 路径很可能会有所不同,并且您需要将 更改为my_awesome_command自定义命令的名称。

[program:custom_command]
directory = /home/dotcloud/current/
command = /home/dotcloud/env/bin/python /home/dotcloud/current/myapp/manage.py my_awesome_command
stderr_logfile = /var/log/supervisor/%(program_name)s_error.log
stdout_logfile = /var/log/supervisor/%(program_name)s.log
于 2012-11-01T13:30:09.150 回答