【问题标题】:Fastest, simplest way to handle long-running upstream requests for Django处理 Django 长时间运行的上游请求的最快、最简单的方法
【发布时间】:2014-02-09 17:10:26
【问题描述】:

我将 Django 与 Uwsgi 一起使用。我们有 8 个进程在运行,我没有真正的迹象表明我们的代码是特别线程安全的,因为它从未在设计时考虑到线程。

最近,我们增加了通过各种 API 从服务供应商处获取实时费率并立即向用户显示的功能。问题是这些请求是旧的 Web 服务技术,由于它们的响应时间,从供应商处获得(或放弃)所有费率所需的时间可能长达 10 秒。

这带来了一个问题。我们网站上的流量相当可观,客户需要经常查看这些费率。只有 8 个进程,很容易看出服务器是如何忙于等待这些上游请求的。尤其是当需要进行其他优化以使网站基线更快时(我们正在努力)。

我们为请求的速率创建了一个单独的库(它应该主要是线程安全的,如果不是,应该很容易地转换为它),我们可以分离出它的配置。所以我想用自己的线程创建一个单独的服务,也许在 Twisted 中,让浏览器联系该服务以获得 JSON,而不是让它在主 Django 服务器中运行。

这个解决方案好不好?你能想出更好或更简单的方法吗?我应该使用 Twisted 以外的东西吗?如果是,为什么?

【问题讨论】:

  • 你看Celery了吗?它是一个异步任务队列,您可以使用它来将 API 请求作为异步任务运行,并具有您需要的尽可能多的工作程序/并发。特别是因为您已经隔离了工作代码,它应该很容易集成。它还具有与 Django 的良好文档集成,以及 flower 形式的出色工作监视器。
  • 异步处理程序看起来恰到好处。不过,Twisted 可能有点矫枉过正。看看 gevent,它很好地与 uWSGI 集成。
  • 是什么让一个软件“矫枉过正”? Twisted 不会显着增加大多数 Python 应用程序的磁盘或内存占用。此外,我们仍在制作更多的 Twisted,所以即使是简单的问题也使用它并不意味着每个人都会过早地用完。
  • @Jean-PaulCalderone 一个简单的答案就是学习曲线。

标签: python django multithreading twisted uwsgi


【解决方案1】:

如果你想在 Django 中使用你的代码,你可以简单地使用Crochet 调用你的 Twisted,它可以在你选择的任何 WSGI 实现中自动管理反应器的创建、运行和关闭(至少假设它的行为类似于常规 Python 进程)。

显然,在 Twisted WSGI 容器中运行可能不太复杂 :-)。

可能还值得关注TReq 来发出您的服务客户端请求;您的新“线程安全”库仍然存在为每个阻塞客户端占用整个线程的缺点,这是不小的内存量和额外的并发开销,而使用 Twisted 您只需要担心几个对象。

【讨论】:

    猜你喜欢
    • 2022-07-29
    • 2023-03-06
    • 2020-10-24
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    相关资源
    最近更新 更多