【问题标题】:Dotcloud: running manage.py background serviceDotcloud:运行manage.py后台服务
【发布时间】:2012-10-21 20:46:14
【问题描述】:

我有一个 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 服务,我也会遇到类似的问题。

【问题讨论】:

  • 放入 supervisor.conf 是合适的地方。你能把你输入的东西放到 supervisor.conf 中阻止它工作吗?

标签: django-orm dotcloud


【解决方案1】:

将其放入supervisord.conf,您就走在了正确的轨道上。您为什么会收到关于找不到 Django 的错误也是正确的。幸运的是,这很容易解决。

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

这是一个使用完全限定路径的示例,以确保我们使用的是正确的文件。除非您的应用也称为 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

【讨论】:

  • 太好了,谢谢!后续问题:您知道将基本信号发送到单个工作线程的最佳方法是什么吗?当活动低时,我让它停止轮询数据库,由 UNIX 信号唤醒。但我突然想到,如果我向外扩展,其他实例将无法看到该过程以发出信号。我宁愿不运行 Celery 和 RabbitMQ 只是为了获得信号行为。我正在考虑运行一个 Amazon EC2 t1micro 实例来托管工作服务器。有什么建议可以单独在 Dotcloud 上实现吗?
  • @acjohnson55 发送信号的对象是什么,信号来自哪里,同一台服务器还是任何服务器? Celery 和 RabbitMQ 之外的另一种方法是使用 redis,只监控 redis 队列,或者使用 Amazon SQS 之类的东西。如果你想要不同的东西,你也可以看看 ZeroMQ。为什么不使用 Amazon EC2 实例,而只运行 dotCloud python-worker 服务?
  • 我有大量重复性任务需要不经常运行,并且在不活动期间,我让工作人员停止轮询,直到它知道下一个任务将准备好。但是,其他任务可能需要同时立即运行,所以我让应用服务器发送一个信号来唤醒工作人员重新开始轮询。工作人员服务可能是一个不错的选择,但存在同样的问题:有没有一种好方法可以触发它,而不是让它不断轮询?
  • @acjohnson55 如果您的工作人员收听发布/订阅频道,那么您可以将信号发送到发布/订阅频道,工作人员只需在该频道上收听消息即可。它不必轮询,就知道下一步该做什么。
  • @acjohnson55 redis 支持 pub/sub 所以 zeroMQ 不支持,你也可以看看 ZeroRPC,它也支持 pub/sub .. 或者类似 pusher.com 等托管的东西。
猜你喜欢
  • 2011-08-11
  • 2016-04-14
  • 1970-01-01
  • 1970-01-01
  • 2019-02-04
  • 2015-11-24
相关资源
最近更新 更多