【问题标题】:Disable threading in django wsgi applciation在 django wsgi 应用程序中禁用线程
【发布时间】:2016-02-20 15:36:12
【问题描述】:

我正在部署一个使用信号的 django 应用程序(因此它需要在单线程中运行)。我可以在开发服务器中禁用线程

python manage.py runserver --nothreading --noreload

而且效果很好。要部署应用程序,我遵循django uwsgi deployment guide 并使用 uwsgi 进行设置。也就是说,用

uwsgi ... -module myapp.wsgi

这样运行应用程序时如何禁用 uwsgi 线程?

编辑: Web 应用程序是一个在线 Mathematica 解释器 Mathics,例如http://mathics.angusgriffith.com/。该信号用于实现评估时间限制。我们目前正在使用线程,但由于 GIL 评估可能会“卡住”,因为一切都受 CPU 限制。我们也尝试使用多处理,但开销太高。 Link to the Mathics signals code.

【问题讨论】:

  • 为什么信号意味着它需要在单线程中运行?你的意思是什么信号?
  • @DanielRoseman,Python 信号,例如docs.python.org/2/library/signal.html,特别是 signal.SIGALRM(或 unix 警报)。否则我会得到ValueError: signal only works in main thread
  • 在 Web 应用程序中做这件事听起来很奇怪。但无论如何,Django 与线程无关;您需要查看 uwsgi 配置文档。
  • @DanielRoseman,也许我不清楚。在没有 uwsgi 的情况下会出现此问题,但我可以通过 --nothreading--noreload 参数来禁用 django 中的线程。引用django docs“默认情况下服务器是多线程的”。我想知道在使用 uwsgi 启动应用程序时如何将参数传递给 django。
  • 我不太明白为什么您希望 Web 应用程序是单线程的,您已经说过这样您可以使用一些 python 信号,但 什么 是那个信号应该在做什么?你需要信号吗? runserver 只在开发网站时使用,你不应该把它的论点当成实时版本应该能够做的事情。

标签: django wsgi uwsgi


【解决方案1】:

考虑到您解释为什么您需要在 Django 应用程序中使用信号,我认为您做的事情非常错误。

如果您只是在视图中开始计算,这可能需要很长时间,那么您将冻结整个工作人员。这意味着,工作人员无法处理任何其他请求。如果您使用 4 个工作人员,并且有 5 个用户将提交需要更多计算的方程,那么将没有资源来处理其中一个工作人员的请求,因为所有 4 个工作人员都将忙于计算。

这意味着,对于大量用户,您将需要大量工人。每个工人都会消耗资源,而你会非常非常快地用完它们。

换句话说,在视图中运行一些长任务是非常糟糕的做法。

考虑使用像 celery 这样的任务队列,将要求解的每个方程发送到 celery 中。这样,您的工作人员将始终可以处理请求,并且任务将排队。管理冻结的任务也会容易得多。

【讨论】:

    【解决方案2】:

    要在使用 uwsgi 部署时禁用线程,在您的 uwsgi.ini 文件中将 threads 设置为 1,这将限制脚本在每个进程中以单个线程运行:

    [uwsgi]
    processes = 4
    threads = 1
    

    这样你就可以使用多个进程,每个进程运行一个线程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-20
      • 2011-09-28
      • 1970-01-01
      • 1970-01-01
      • 2020-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多