我可以让Python代码在调用Flask之后继续执行吗app.run?

2024-06-16 09:51:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚刚开始使用Python,尽管在过去的30年里我一直在用其他语言编程。我想让我的第一个应用程序保持简单,所以我开始了一个小的家庭自动化项目托管在一个树莓派。在

我让代码正常工作(控制阀门、读取流量传感器并在显示器上显示一些数据),但当我想添加一些web交互时,它突然停止了。 我在这个主题上找到的大多数文章都建议使用Flask框架来构建动态web页面。我试过了,也了解了烧瓶的基本原理,但我就是无法回避烧瓶堵塞的问题应用程序运行“功能。其余的python代码等待Flask返回,但这从来没有发生过。一、 e.不再测量水流量,阀电机转向或显示更新。在

所以,我的基本问题是:为了在应用程序的主要任务(GPIO/脉冲计数)并行的情况下为一个简单的动态网页提供服务(负载非常低,比如1个请求/周)?所有这些都是在资源受限的环境中的树莓Pi(3)。 如果您仍然建议使用Flask(因为它看起来非常接近目标),那么我应该如何安排我的代码来继续处理现实世界中的事件,比如上面提到的?在

(最后一部分可能很难在没有看到实际代码的情况下回答,但也许可以用“通用”的方式来回答?或者指出我在搜索时可能遗漏的现有示例。)


Tags: 项目代码web语言应用程序flask烧瓶编程
3条回答

多线程处理是正确的。如果监视代码在循环中运行,可以定义一个函数

def monitoring_loop():
    while True:
        # do the monitoring

然后,在调用app.run()之前,启动一个运行该函数的线程:

^{pr2}$

不要join线程-你希望它与你的Flask应用程序保持并行运行。如果您加入它,它将阻塞主执行线程直到它完成,这永远不会发生,因为它正在运行一个while True循环。在

要在监视线程和程序的其余部分之间进行通信,可以使用queue在它们之间以线程安全的方式传递消息。在

我处理这个问题的方法可能是把你的程序分成两个不同的独立运行的程序。在

一个程序处理GPIO监视和通信,另一个程序是您的小型烧瓶服务器。因为它们作为独立的进程运行,所以不会互相阻塞。在

您可以让这两个进程通过一个小型数据库进行通信。GIPO接口可以定期将流量测量或其他相关数据记录到数据库中的表中。它还可以监视数据库中可能用作请求队列的另一个表。在

您的Flask实例可以查询同一个数据库以获取当前统计信息并返回给用户,还可以根据用户输入向请求队列提交条目。(如果GIPO进程将请求队列的当前状态更新为当前状态,Flask进程可以报告返回状态。)

至于在一个小树莓Pi上使用什么样的数据库,考虑一下sqlite3这是一个非常小的、轻量级的基于文件的数据库,在Python中作为标准库得到了很好的支持。(不需要运行完整的“数据库服务器”进程。)

祝你的项目好运,听起来很有趣!在

嗨,我正在尝试与dronekit sitl连接,但我遇到了同样的问题,30秒后连接关闭。到解决这个问题,有两种解决方案:

  1. 在请求之前使用decorator:在这个方法中,您定义了一个方法,在每个请求之前处理连接
  2. 在第一个请求之前使用decorator:在这种情况下,一旦调用第一个请求,就会建立连接,并且可以使用全局变量处理另一个路由中的对象

有关详细信息https://pythonise.com/series/learning-flask/python-before-after-request

相关问题 更多 >