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

Jay*_*m R 8 python apache django signals mod-wsgi

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

我知道信号只适用于主线程,所以我运行Django开发服务器,

python manage.py runserver --nothreading --noreload
Run Code Online (Sandbox Code Playgroud)

它工作正常.

但是当我使用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
Run Code Online (Sandbox Code Playgroud)

这是我的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}
Run Code Online (Sandbox Code Playgroud)

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

WSGIRestrictSignal Off
WSGISocketPrefix /var/run/wsgi
Run Code Online (Sandbox Code Playgroud)

这是程序的链接,它使用信号和我在django应用程序中使用的信号.

任何帮助,将不胜感激.

Fer*_*ndo -1

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

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

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

或者,更好的是,正如sh要求您在处理信号时要小心一样,您可以在没有异步执行模块的情况下运行它,而是在另一个具有multiprocessing.Proces 的进程中运行它,这将为您提供一个Process可以直接杀死的对象object.terminate()