【发布时间】: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只在开发网站时使用,你不应该把它的论点当成实时版本应该能够做的事情。