【问题标题】:Django Asynchronous ProcessingDjango 异步处理
【发布时间】:2011-05-30 22:47:42
【问题描述】:

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

现在一切都是同步的(使用带有 sync 工作类型的 Gunicorn),但我想让它异步且非阻塞。总之我想做点什么:

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

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

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

提前致谢!

【问题讨论】:

  • 你如何处理计算结果?
  • 将结果(以 JSON 格式)返回给用户的浏览器。

标签: python django asynchronous celery cython


【解决方案1】:

芹菜是完美的选择。

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

我在 Celery 的开发版本中使用 Redis,以下是我配置的相关部分:

# 使用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 的集成很愉快。

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

【讨论】:

  • 另外,我在使用 gevent + 对 Celery 进行猴子修补时没有任何问题,所以如果你使用 gevent gunicorn worker 和 monkeypatch celery,一切都应该是神奇的异步.
  • 感谢您的提示。我过去曾尝试使用gevent workers + monkey patching,但它会减慢我的应用程序爬行速度。我怀疑这是因为我与 MySQL 的连接受阻。我需要移动到不同的数据库吗?
  • 抱歉,我没有使用gevent 和其他数据库,所以我不能说。也许发布另一个问题来询问这个问题?
  • MySQLdb驱动是用C写的,不使用python socket模块。这意味着它不能被猴子修补并且会阻塞整个 gevent 循环。 github.com/mthurlin/gevent-MySQL 是异步版本。
  • 是的,如果调用类似于my_task.apply(…),Django 线程将阻塞等待任务完成。这可能是有意义的,例如,该任务是 CPU 密集型......但它不会释放 Django 线程。
【解决方案2】:

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

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

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

client browser <> async frontend server <> backend server for computations

【讨论】:

    猜你喜欢
    • 2019-08-29
    • 2012-07-29
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2017-06-03
    • 2016-04-29
    • 2018-08-21
    • 2022-10-14
    相关资源
    最近更新 更多