【问题标题】:Whats the best way to present a flask interface to ongoing backround task?将烧瓶界面呈现给正在进行的后台任务的最佳方式是什么?
【发布时间】:2015-06-14 12:04:02
【问题描述】:

我有一个长时间运行的进程,它不断地从 telnet 端口读取数据,并且可能偶尔会对其进行写入。有时我想向它发送一个 HTTP 请求,以获取它自上次询问以来读取的信息。有时我可能会发送一个 HTTP 请求来将某些数据写入另一个 telnet 端口。

我应该使用 2 个线程执行此操作吗?如果是,我应该使用互斥体或指令队列。无论如何,您如何使用烧瓶进行线程化?我应该使用多处理吗?还有什么?

我问这个问题的原因是我遇到了类似问题(但串行端口而不是 telnet 端口,直接在应用程序中而不是本地/远程 HTTP 服务中)并且最终以某种方式几乎从未出现非数据读取线程即使我插入了大量的睡眠电话,也会运行。我最终将它从互斥体重写到队列,然后使用带队列的多处理。

编辑:telnet 端口是与硬件(打印机)通信(主要读取调试数据)的应用程序的连接。我要编写的烧瓶 HTTP 服务将通过在打印机上运行的测试来访问(在同一台机器上或与 HTTP 服务不同的机器上),这些都不涉及 Web 浏览器!

【问题讨论】:

    标签: python multithreading flask multiprocessing multitasking


    【解决方案1】:

    这类长轮询作业最好使用套接字来实现,它们并不真正适合 Flask/WSGI 模型,因为它不适合异步操作。你可能想看看扭曲或龙卷风。

    也就是说,您读取/写入 telnet 的后端进程可能在单独的线程中运行,该线程可能会或可能不会从 HTTP 请求启动。一旦你从烧瓶应用程序中启动一个线程,它就不会阻止响应。

    您可以通过偶尔轮询 Flask 应用程序以获取新数据来从它写入的数据存储中读取。这可以在浏览器中使用 javascript 和超时在客户端实现,但它有点 hacky。

    【讨论】:

      【解决方案2】:

      对此的理想解决方案是为您的 Flask 应用程序和长时间运行的进程设置单独的线程,并使用消息队列在线程之间代理消息。 Message queues 是在解耦架构组件的同时允许线程间通信的好方法。

      在考虑线程时,您必须考虑运行 Flask 应用程序所使用的服务器。运行app.run() 时获得的开发服务器是一个同步进程,一次可以处理一个请求。将 Flask 应用程序部署到像 Gunicorn 这样的多线程服务器上,您基本上可以为每个工作人员提供一个进程。 IE。 4 个线程上的 4 个工作人员将能够处理 4 个并发请求。

      对 Flask 的每个请求都有自己的 thread local object 用于请求和会话数据,因此在设计代码时请考虑这一点。消息队列不仅适合在 Flask 和您的长时间运行的进程之间传递消息,还适合在您的各个 Flask 线程之间传递消息。

      现在我们已经介绍了线程,让我们来谈谈消息队列。您可以在这里使用几种不同的模式,但我将重点介绍 pub-sub。当数据需要从一个地方流向多个地方时,发布者-订阅者模型非常适合。让我们调用长时间运行的进程 A,以及运行 Flask 应用程序 B 的线程或多个线程(关于 pub-sub 很酷的部分是这两种情况都可以工作)。

      B 可以“订阅”来自 A 通过队列的消息,A 可以在需要时向队列发送消息。队列可以通过将消息推送给订阅者或等待他们将消息从队列中拉出,将消息“发布”给订阅者。使用 Flask 的一个好的解决方案可能是在每个请求开始时检查队列中的新消息。您也可以让 B 以类似的方式发布回 A。

      话虽如此,这是一个非常开放的结局,因此没有一种正确的方法可以做到这一点。这是我推荐的,因为它遵循了一些对我有用的最佳实践。此外,我试图让这些答案与技术无关,但有一个很好的 using Redis for a message queue with Flask 示例,您可以查看更多想法。

      【讨论】:

        【解决方案3】:

        我想可以将 celery 用于这种在后台运行并且在特定时间定期运行的作业。

        Celery Based Background Tasks

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-12-06
          • 2018-05-22
          • 1970-01-01
          • 1970-01-01
          • 2020-09-21
          • 1970-01-01
          • 2015-10-01
          • 1970-01-01
          相关资源
          最近更新 更多