【问题标题】:ValueError: signal only works in main thread - Django - mod_wsgiValueError:信号仅在主线程中有效 - Django - mod_wsgi
【发布时间】:2014-11-06 19:18:58
【问题描述】:

我正在尝试执行一个 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 中的虚拟主机之外也有以下设置:

WSGIRestrictSignal Off
WSGISocketPrefix /var/run/wsgi

Here is the link 到使用 signal 的程序和我在 django 应用程序中使用的程序。

任何帮助将不胜感激。

【问题讨论】:

    标签: python django apache signals mod-wsgi


    【解决方案1】:

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

    【讨论】:

    • 我建议不要在答案中使用修辞问题。他们冒着被误解为根本不是答案的风险。您正在尝试回答此页面顶部的问题,不是吗?否则请删除此帖。
    • 这不是修辞,op 没有具体说明。来自 django 的文档:“同样重要的是要记住,在打开 DEBUG 的情况下运行时,Django 会记住它执行的每个 SQL 查询。”所以我认为它可以解释问题。
    • 你可以决定。要么是答案中的修辞问题,这还不错,我只是建议不要这样做;或者它根本不是一个答案,而你正在问一个你想要答案的问题。在这种情况下,这根本不是答案,可以这样标记和删除,因为您应该在评论中提出这类问题。你确实有评论的权限。
    【解决方案2】:

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

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

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

    或者,甚至更好,因为sh 要求您在处理信号时要小心,您可以在没有异步执行模块的情况下运行它,但在另一个带有multiprocessing.Proces 的进程中,这会给您一个Process你可以用object.terminate()杀死对象

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多