我正在部署使用信号的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
答案 0 :(得分:0)
要在使用uwsgi进行部署时禁用线程,请在uwsgi.ini
文件集threads
到1
中,这将限制脚本在每个进程的单个thead中运行:
[uwsgi]
processes = 4
threads = 1
因此,您可以使用多个进程,每个进程都运行单个线程。
答案 1 :(得分:0)
考虑到你在Django应用程序中需要信号的原因,我认为你做的事情非常糟糕。
如果你只是在你的视图中开始计算,那可能需要很长时间,那时你会冻结整个工人。这意味着,工作人员无法处理任何其他请求。如果您正在使用4名工作人员,并且将有5名用户提交需要更多计算的等式,则没有资源可以处理来自其中一人的请求,因为所有4名工作人员都将忙于计算。
这意味着,对于大量用户,您将需要大量工作人员。每个工作人员都会消耗资源,你会非常非常快地耗尽资源。
换句话说,在视图中运行一些长任务是非常糟糕的做法。
考虑使用像芹菜一样的任务队列,将每个方程式解决到芹菜中。这样,您的工作人员将始终可用于处理请求,并且任务将排队。管理冻结的任务也会轻松得多。