【问题标题】:concurrent requests on dotcloud with djangodjango 在 dotcloud 上的并发请求
【发布时间】:2012-08-04 17:11:30
【问题描述】:

我有一个想要迁移到 dotcloud 的 django 应用程序。 Django 内部和我的应用程序中的许多操作都不是异步的,即它们阻塞线程直到它们完成。 当我使用 Apache 时,这并没有造成问题,因为每个请求都会打开一个不同的线程。但在 dotcloud 使用的 nginx/uwsgi 中似乎并非如此。 表面上看,uwsgi 有一个 --enable-threads 和 --threads 选项可以用于多线程,但是:

  1. 不清楚 uwsgi dotcloud 使用什么版本,是否支持这些功能
  2. 由于我没有其他人问过这个问题,我想知道这是否真的是让并发请求运行的正确方法(使用线程)

【问题讨论】:

  • 等等,nginx 上的 Django 一次只能处理一个请求?还是我误会了?
  • Django 本身不处理多线程,它取决于它使用的 wsgi 层(或任何高于它的层)。您可以通过使用不同配置的 gunicorn 或 Django 上面类似的东西来实现不同形式的并发(进程、线程、gthreads)
  • 我几天前看过,据我所知,默认情况下配置的 uwsgi 包 Dotcloud 使用 Supervisord 来运行许多 uswsgi 工作人员,这允许您的应用程序提供更多服务一次不止一个请求。不过不要把它当作福音,因为我不是这方面的专家。

标签: django multithreading apache dotcloud


【解决方案1】:

您可以使用Gunicorn 运行 Django。反过来,Gunicorn 支持多个worker classes,并且人们报告成功运行 gunicorn+gevents+django 一起[1][2]

要在 dotCloud 上使用它,您可能必须使用 dotCloud 的自定义服务。如果这是你想尝试的东西,我个人会从 dotCloud 的 reimplementation of python service using the custom service 开始,并在其中将 uwsgi 替换为 gunicorn。

【讨论】:

    【解决方案2】:

    我来这里寻找一些线索,我找到了,谢谢! 不过,要真正让东西正常工作,还需要做大量的腿部工作。

    这是 github 上的一个示例应用,它在 dotcloud 上使用 gunicorn、gevent 和 socketio:

    https://github.com/t1m0thy/django-tictactoe/tree/dotcloud

    【讨论】:

      【解决方案3】:

      线程是 python 中的一个问题 - GIL 不允许它们同时运行。 所以多处理是一个答案。

      或者你可以看看gevent。实际上 gevent 是一种 hack(python 堆栈的猴子补丁)等等,但它允许启动绿色线程。 我不确定 gevent 是否可以与 django 结合使用,但 google 知道;)

      【讨论】:

      • Python 线程是“真实的”,但由于 GIL,当您尝试使用所有内核或类似的东西进行并行计算时,它们没有任何好处。如果您正在等待 IO,它们很有用。此外,这并不能回答问题
      • gevent 在等待 IO 时很有用。由于全局解释器锁,在 CPython 中只有一个线程可以一次执行 Python 代码 - 请阅读 docs.python.org/library/threading.html
      • 是的,只有一个可以“执行”,但很多人可以等待 IO,所以它可以工作。而且我不认为您可以通过将 gevent 集成到 django 中来神奇地使 django 异步工作,或者至少我没有听说过。如果您知道这样做的方法,我会很乐意用所有积分奖励您
      猜你喜欢
      • 2013-09-28
      • 2023-01-20
      • 2012-10-10
      • 1970-01-01
      • 2023-03-03
      • 2012-10-21
      • 1970-01-01
      • 2012-08-12
      • 2012-02-28
      相关资源
      最近更新 更多