2011-12-20 49 views
4

我正在构建一个Django应用程序,它依赖于已经实现了SIGINT信号处理程序的python模块。Python:Django:信号处理程序和主线程

假设我不能改变我所依赖的模块,我该如何解决“信号只在主线程中工作”的错误我把它集成在Django中?

我可以在Django主线程上运行它吗? 有没有办法阻止处理程序允许模块在非主线程上运行?

谢谢!

+0

我有同样的问题。奇怪的是我很确定我没有使用任何线程。我只是运行manage.py runserver。 – 2012-03-15 22:28:52

回答

0

虽然问题并不确切地描述你的情况,这里是一些比较通用的建议:

的信号只发送到主线程。出于这个原因,信号处理程序应该在主线程中。 从那时起,信号触发的动作需要传送给其他线程。我通常使用Events来做这件事。信号处理程序设置事件,其他线程将读取该事件,然后意识到动作X已被触发。显然这意味着应该在线程之间共享事件属性。

2

Django的内置开发服务器具有默认启用的自动重新加载功能,它产生一个新线程作为重新加载代码的手段。要解决这一点,你可以简单地做到以下几点,虽然你会明显失去自动重载的方便:

python manage.py runserver --noreload 

您还需要选择你的产品设置时要留意这一点。至少有一些部署选项(如线程化fastcgi)肯定会在主线程之外执行您的代码。

1

我用Python 3.5和Django 1.8.5与我的项目,我最近遇到了类似的问题。我可以直接运行我的xxx.py代码,信号,但它不能在Django上作为一个包仅仅因为“信号只在主线程中有效”才能执行。

首先,与--noreload --nothreading运行服务器是可用的,但它运行我的多线程代码对我来说太慢了。

其次,我发现我的包的__init__.py中的代码在主线程中运行。但是,当然,只有主线程可以捕捉到这个信号,我的包中的代码根本无法捕捉它。它不能解决我的问题,但它可能是您的解决方案。

最后,我发现Python中有一个名为subprocess的内置模块。这意味着你可以用它运行一个完整的子过程,也就是说,这个过程有它自己的主线程,所以你可以很容易地在这里运行你的代码SIGNAL。虽然我不知道使用它的表现,但它对我来说效果很好。 PS,你可以在Python文档中找到关于subprocess的所有细节。

谢谢〜