我正在尝试执行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应用程序中使用的程序。
任何帮助将不胜感激。
答案 0 :(得分:0)
您是否在 setting.py 中启用了 DEBUG 运行? 如果是,请尝试禁用它以查看问题是否仍然存在。
答案 1 :(得分:-1)
我不确定是否可以轻松完成,或者至少不能使用mod_wsgi。线程或不线程的决定是apache和mod_wsgi中的构建和运行时选项的总和,它们都是默认设置的线程。
我会向您指出有关该文档的文档,但我只能发布两个链接,因此我认为将它们用于提出解决方案会更好:
我在使用sh的python运行shell命令方面有很好的经验,它甚至有一个异步执行模块。也许你可以启动运行shell命令的python代码,并在需要时处理回调对象。
或者更好,因为sh
要求您在处理信号时要小心,您可以在没有异步执行模块的情况下运行它,但在另一个使用multiprocessing.Proces的进程中运行它会给您您可以使用Process
object.terminate()
个对象