ValueError:signal仅适用于主线程 - Django - mod_wsgi

时间:2014-09-12 14:58:16

标签: python django apache signals mod-wsgi

我正在尝试执行shell命令并使用python signal 模块将其终止。

我知道信号只适用于主线程,因此我使用

运行Django开发服务器
python manage.py runserver --nothreading --noreload

它工作正常。

但是当我使用Apache / mod_wsgi部署django应用程序时,它显示以下错误:

[Fri Sep 12 20:07:00 2014] [error]     response = function.call(request, **data)
[Fri Sep 12 20:07:00 2014] [error]   File "/Site/cloud/lib/python2.6/site-packages/dajaxice/core/Dajaxice.py", line 18, in call
[Fri Sep 12 20:07:00 2014] [error]     return self.function(*args, **kwargs)
[Fri Sep 12 20:07:00 2014] [error]   File "/Site/cloud/soc/website/ajax.py", line 83, in execute
[Fri Sep 12 20:07:00 2014] [error]     data = scilab_run(code, token, book_id, dependency_exists)
[Fri Sep 12 20:07:00 2014] [error]   File "/Site/cloud/soc/website/helpers.py", line 58, in scilab_run
[Fri Sep 12 20:07:00 2014] [error]     output = task.run().communicate()[0]
[Fri Sep 12 20:07:00 2014] [error]   File "/Site/cloud/soc/website/timeout.py", line 121, in run
[Fri Sep 12 20:07:00 2014] [error]     lambda sig,frame : os.killpg(self.pgid,self.timeoutSignal) )
[Fri Sep 12 20:07:00 2014] [error] ValueError: signal only works in main thread

这是我的apache虚拟主机设置:

WSGIDaemonProcess testcloud display-name=scilab_cloud  user=apache group=apache threads=1
WSGIProcessGroup testcloud
WSGIScriptAlias / /Site/cloud/soc/soc/wsgi.py
WSGIImportScript /Site/cloud/soc/soc/wsgi.py process-group=testcloud application-group=%{GLOBAL}

我在httpd.conf中的virtualhost外面也有以下设置:

WSGIRestrictSignal Off
WSGISocketPrefix /var/run/wsgi

Here is the link使用信号的程序以及我在django应用程序中使用的程序。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

您是否在 setting.py 中启用了 DEBUG 运行? 如果是,请尝试禁用它以查看问题是否仍然存在。

答案 1 :(得分:-1)

我不确定是否可以轻松完成,或者至少不能使用mod_wsgi。线程或不线程的决定是apache和mod_wsgi中的构建和运行时选项的总和,它们都是默认设置的线程。

我会向您指出有关该文档的文档,但我只能发布两个链接,因此我认为将它们用于提出解决方案会更好:

我在使用sh的python运行shell命令方面有很好的经验,它甚至有一个异步执行模块。也许你可以启动运行shell命令的python代码,并在需要时处理回调对象。

或者更好,因为sh要求您在处理信号时要小心,您可以在没有异步执行模块的情况下运行它,但在另一个使用multiprocessing.Proces的进程中运行它会给您您可以使用Process

杀死object.terminate()个对象