Eri*_*ond 3 python multithreading asynchronous flask
我刚刚开始使用Python,尽管过去30年来我一直在用其他语言进行编程。我想使我的第一个应用程序保持简单,因此我从Raspberry Pi上托管的一个小型家庭自动化项目开始。
我的代码可以正常工作(控制阀,读取流量传感器并在显示屏上显示一些数据),但是当我想添加一些Web交互性时,它突然停止了。我在该主题上发现的大多数文章都建议使用Flask框架来组成动态网页。我已经尝试并理解了Flask的基础知识,但是一旦我调用“ app.run”函数,就无法解决Flask阻塞的问题。我的其余python代码等待Flask返回,但从未发生。即不再进行水流量测量,阀马达转向或显示更新。
因此,我的基本问题是:与应用程序的主要任务(GPIO /脉冲计数)并行地,我应该使用哪种工具来提供简单的动态网页(负载非常低,如每周1次请求)?所有这些都是在Raspberry Pi(3)的资源受限环境中进行的。如果您仍然建议Flask(因为它似乎非常接近目标),那么我应该如何安排我的代码以继续处理现实世界中的事件,例如上面提到的事件?
(这最后一部分可能很难回答,而没有看到实际的代码,但是也许可以用“通用”的方式回答它?或者指向我在搜索时可能会错过的现有示例。)
您在多线程方面处于正确的轨道。如果您的监视代码循环运行,则可以定义一个函数,例如
def monitoring_loop():
while True:
# do the monitoring
Run Code Online (Sandbox Code Playgroud)
然后,在调用之前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
Run Code Online (Sandbox Code Playgroud)
不要join使用线程-您希望它保持与Flask应用程序并行运行。如果您加入它,它将阻塞主执行线程,直到完成为止,因为它将运行while True循环,所以永远不会执行。
要在监视线程和程序的其余部分之间进行通信,可以使用队列以线程安全的方式在它们之间传递消息。