WSGI 中的对象持久化

Object persistence in WSGI

我一直在为一个简单的 raspberry pi 项目开发 Web 界面。它只是打开和关闭灯,但我一直在尝试使用 PWM 添加调光功能。

我在 Apache 中使用 modWSGI,RPi.GPIO 用于 GPIO 访问。对于我的原型,我将 (3) 个串联的 SN74HC595 用于 LED 输出,并尝试对 OE 线路进行 PWM 调暗。

操作移位寄存器很容易,因为它们在更新之间保存输出。但是,要使 PWM 工作,GPIO.PWM 实例必须在 WSGI 会话之间保持活动状态。这就是我遇到的麻烦。我已经为此工作了几天,在这里看到了几个类似的问题。但是对于像 PWM 这样的有源对象没有任何作用,只有简单的计数器等。

我的两个想法是:

1)使用全局作用域持有PWM对象,在WSGI函数中使用PWM.ChangeDutyCycle()改变亮度。这种方法以前有用过,但这里好像行不通了。

或者 2) 创建一个系统级守护进程(或其他东西)并从我的 WSGI 函数中调用它。

对于 mod_wsgi 非常重要,如果您需要内存中的内容在请求中保持不变,您必须使用 mod_wsgi 守护程序模式而不是嵌入式模式。嵌入式模式是默认模式,因此您需要确保您正在配置它。守护进程模式的默认值是单进程,因此请求将始终命中同一个进程。不过它仍然是多线程的,因此请确保使用线程锁定保护全局数据 access/update。

有关嵌入式与守护程序模式的详细信息:

您将在文档中看到一些有关守护进程模式的示例,其中还解释了您应该如何配置虚拟环境。

对于 2020 年看到此内容的任何人:

我把mod_wsgi改成了单线程模式。我不确定它是否与 Python、mod_wsgi 或 bad juju 有关,但它仍然不会持续很长时间。几个小时后,PWM 将完全关闭。

我尝试运行我自己的 PWM 守护进程,但最终还是使用了 pigpio 模块(Joan 在 SE 上吗?)。它对我来说一直很完美。