尽管过去 30 年来我一直在使用其他语言进行编程,但我才刚刚开始使用 Python。我想让我的第一个应用程序保持简单,所以我从一个托管在 Raspberry Pi 上的小型家庭自动化项目开始。
我的代码工作正常(控制阀门、读取流量传感器并在显示器上显示一些数据),但是当我想添加一些网络交互性时,它突然停止了。
我发现的大多数关于该主题的文章都建议使用 Flask 框架来编写动态网页。我已经尝试并理解了 Flask 的基础知识,但是当我调用“app.run”函数时,我无法解决 Flask 阻塞的问题。我的 python 代码的其余部分等待 Flask 返回,但这从未发生。 IE。不再需要水流量测量、阀门电机转向或显示更新。
所以,我的基本问题是:我应该使用什么工具来服务一个简单的动态网页(负载非常低,例如每周 1 个请求),与我的应用程序主要任务(GPIO/脉冲计数)并行?所有这一切都是在 Raspberry Pi 的资源受限环境中实现的 (3)。
如果您仍然建议使用 Flask(因为它看起来非常接近目标),我应该如何安排我的代码以继续处理现实世界的事件,例如上面提到的?
(如果没有看到实际的代码,最后一部分可能很难回答,但也许可以用“通用”方式回答它?或者指出我在搜索时可能错过的现有示例。)
您在多线程方面走在正确的轨道上。如果您的监控代码在循环中运行,您可以定义一个类似的函数
def monitoring_loop():
while True:
# do the monitoring
然后,在你打电话之前app.run()
,启动一个运行该函数的线程:
import threading
from wherever import monitoring_loop
monitoring_thread = threading.Thread(target = monitoring_loop)
monitoring_thread.start()
# app.run() and whatever else you want to do
Don't join
线程 - 您希望它与 Flask 应用程序保持并行运行。如果你加入它,它会阻塞主执行线程直到它完成,这永远不会,因为它正在运行一个while True
loop.
要在监视线程和程序的其余部分之间进行通信,您可以使用queue https://docs.python.org/3/library/queue.html#module-queue在它们之间以线程安全的方式传递消息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)