Python:Django:信号处理程序和主线程

cod*_*ack 6 python django multithreading signal-handling

我正在构建一个django应用程序,它依赖于一个已实现SIGINT信号处理程序的python模块.

假设我无法更改我依赖的模块,我如何解决"信号仅在主线程中工作"错误我将其集成到Django中?

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

谢谢!

小智 6

Django 的内置开发服务器默认启用自动重新加载功能,它会生成一个新线程作为重新加载代码的一种方式。要解决这个问题,您可以简单地执行以下操作,尽管您显然会失去自动重新加载的便利:

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

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


Cha*_*des 0

虽然问题没有准确描述您所处的情况,但这里有一些更通用的建议:

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