8

我有一堆 Django 请求,它们执行一些数学计算(用 C 编写并通过 Cython 模块执行),这可能需要不确定的时间(大约 1 秒)来执行。此外,请求不需要访问数据库,并且彼此独立且 Django。

现在一切都是同步的(使用带有sync工作类型的 Gunicorn),但我想让它异步且非阻塞。简而言之,我想做一些事情:

  1. 接收 AJAX 请求
  2. 将任务分配给可用的工作人员(不阻塞主 Django Web 应用程序)
  3. 工人在未知的时间内执行任务
  4. 每当任务完成时,Django 将计算结果(字符串列表)作为 JSON 返回

我对异步 Django 很陌生,所以我的问题是这样做的最佳堆栈是什么。

任务队列非常适合这种过程吗?有人会推荐 Tornado + Celery + RabbitMQ,还是别的什么?

提前致谢!

4

2 回答 2

14

芹菜很适合这个。

由于您正在做的事情相对简单(阅读:您不需要有关如何路由任务的复杂规则),您可能会使用 Redis 后端,这意味着您不需要设置/配置 RabbitMQ (根据我的经验,这更困难)。

我将 Redis 与 Celery 的大多数开发版本一起使用,以下是我的配置的相关位:

# 使用redis作为队列
BROKER_BACKEND = "kombu.transport.pyredis.Transport"
BROKER_HOST = "本地主机"
BROKER_PORT = 6379
BROKER_VHOST = "0"

# 将结果存储在redis中
CELERY_RESULT_BACKEND = "redis"
REDIS_HOST = "本地主机"
REDIS_PORT = 6379
REDIS_DB = "0"

我也在使用django-celery,这使得与 Django 的集成很愉快。

如果您需要任何更具体的建议,请发表评论。

于 2010-12-27T04:52:33.573 回答
0

由于您计划使其异步(可能使用类似 gevent 的东西),您还可以考虑为计算工作创建一个线程/分叉的后端 Web 服务。

异步前端服务器可以处理所有轻量级的工作,从适合异步的数据库(redis 或带有特殊驱动程序的 mysql)中获取数据等。当必须完成计算时,前端服务器可以将所有输入数据发布到后端服务器并在后端服务器完成计算时检索结果。

由于前端服务器是异步的,因此在等待结果时不会阻塞。与使用 celery 相比,这样做的优点是您可以在结果可用时立即将结果返回给客户端。

client browser <> async frontend server <> backend server for computations
于 2011-09-14T18:19:39.150 回答