【问题标题】:How to run a background control task inside a Flask app?如何在 Flask 应用程序中运行后台控制任务?
【发布时间】:2021-12-20 07:03:28
【问题描述】:

上下文

我在一家逃脱游戏公司工作。

我们目前有一个控制游戏的 Windows 应用:

  • 它运行一个大循环来检查所有传感器的所有状态(通过查询 PC 的串行端口)、做出决定并向同一个串行端口发送命令。
  • 它有一个 GUI,游戏管理员可以在其中监控游戏状态并在需要时发送手动命令以绕过某些游戏逻辑。

它运行良好,但出于稳定性原因、更新噩梦等原因,我们希望为该特定应用程序远离 Windows。我们想在 Linux 上运行所有这些。

项目

理想的情况是运行游戏的 PC 是无头的,并且使用 Web 界面远程控制逃生室软件的系统。这比目前运营商必须使用Windows远程桌面远程控制游戏PC的情况更好。

我想要某种 RESTful API 可以被一些 JS 网页查询来显示系统的状态并向它发送命令。

我不得不在 Python 中执行服务器部分。

但是,我不知道如何接近那个系统。

一方面,我将拥有一个控制现实世界事物的软件,并且显然在给定时间只管理一个游戏。基本上是一个大的、非阻塞的、始终运行的循环。

另一方面,我将有一个 REST API 来向正在运行的游戏发送命令。 如果我看一下 Flask 等 Web 框架,它提供了 RESTful API,但它旨在同时处理多个连接,并使它们基本上相互隔离。

我不知道如何让该 Web 部件与游戏系统部件进行讨论。

如你所料,我根本不是专家。我想让系统尽可能简单,以使其易于管理和理解。

这里最好的方法(就简单性而言)应该是什么?

我很难拥有两个应用程序,一个运行游戏和一个网络服务器,通过某种进程间通信发送命令和接收状态。但是看起来很复杂。

一个梦想是能够在 Flask 框架中拥有一种后台任务,该任务正在运行游戏、发送串行端口请求并跟踪游戏脚本。同时,当收到 REST 请求时,请求的回调函数会访问后台任务的变量,收集游戏的状态并做出相应的回复。

但我没有理想的方法。我什至不知道谷歌用什么关键字来知道如何做到这一点。这里是否有一种常见的模式,这种模式非常普遍,并且受到基本框架的支持?还是我在重新发明轮子?

【问题讨论】:

  • 嗨!很有趣的项目。这个网站往往会更好地处理特定问题。您首先要查看的是threading 模块(和queue)。如果您需要提高健壮性(和复杂性),请查看带有数据库的 celery。我要给你一个简单的开场白,也许会再发一个有针对性的问题。

标签: python linux rest flask


【解决方案1】:

要在与 Flask 应用程序相同的进程中运行永久后台任务,请使用 threading.Thread 运行具有无限循环的函数。通过线程安全的queue.Queue 进行通信。

注意:如果超出单个进程,这将创建多个单独的控制任务,这可能是不希望的。扩展需要外部数据库或队列以及 Celery 等任务框架。

示例(基于 Flask 快速入门和基本线程用法):

from flask import Flask
from queue import Queue, Empty
from threading import Thread
from time import sleep

app = Flask(__name__)
commands = Queue()

def game_loop():
    while True:
        try:
            command = commands.get_nowait()
            print(command)
        except Empty:
            pass
        sleep(5)  # TODO poll other things

Thread(target=game_loop, daemon=True).start()

# Literally the Flask quickstart but pushing to the queue
@app.route("/")
def hello_world():
    commands.put_nowait({ 'action': 'something' })
    return "<p>Hello, World!</p>"

【讨论】:

  • 好吧。这正是我所希望的。这比我预期的要简单得多。它在某种程度上是有限的,但是嘿:没有免费的午餐......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 2011-02-10
  • 2015-09-27
  • 2016-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多