如何在 django wsgi 应用程序中禁用线程?

问题描述 投票:0回答:2

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

禁用开发服务器中的线程

python manage.py runserver --nothreading --noreload

而且效果很好。为了部署应用程序,我遵循了 django uwsgi 部署指南 并使用 uwsgi 进行设置。也就是说,与

uwsgi ... -module myapp.wsgi

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

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

django wsgi uwsgi
2个回答
1
投票

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

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

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

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

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


1
投票

要在使用 uwsgi 部署时禁用线程,请在

uwsgi.ini
文件中将
threads
设置为
1
,这将限制脚本在每个进程的单个 thead 中运行:

[uwsgi]
processes = 4
threads = 1

因此,您可以使用多个进程,每个进程运行单个线程。

© www.soinside.com 2019 - 2024. All rights reserved.