在django wsgi applciation中禁用线程

时间:2016-02-20 15:36:12

标签: django wsgi uwsgi

我正在部署使用信号的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

2 个答案:

答案 0 :(得分:0)

要在使用uwsgi进行部署时禁用线程,请在uwsgi.ini文件集threads1中,这将限制脚本在每个进程的单个thead中运行:

[uwsgi]
processes = 4
threads = 1

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

答案 1 :(得分:0)

考虑到你在Django应用程序中需要信号的原因,我认为你做的事情非常糟糕。

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

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

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

考虑使用像芹菜一样的任务队列,将每个方程式解决到芹菜中。这样,您的工作人员将始终可用于处理请求,并且任务将排队。管理冻结的任务也会轻松得多。