如何在 Flask 应用程序中运行后台控制任务?

Blu*_*980 1 python linux rest flask

语境

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

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

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

它工作得很好,但出于稳定性、更新噩梦等原因,我们希望针对该特定应用程序放弃 Windows。我们希望在 Linux 上运行这一切。

该项目

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

我想要某种 RESTful API,可以通过某些 JS 网页查询来显示系统状态并向其发送命令。

我必须用 Python 来完成服务器部分。

但是,我不知道如何处理该系统。

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

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

我不知道如何使该网络部分与游戏系统部分进行讨论。

正如您所猜到的,我根本不是专家。我希望系统尽可能简单,以使其易于管理和理解。

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

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

一个梦想是能够在运行游戏、发送串行端口请求并遵循游戏脚本的 Flask 框架内执行某种后台任务。同时,当收到REST请求时,请求的回调函数将访问后台任务的变量来收集游戏的状态并做出相应的回复。

但我不知道如何做到这一点。我什至不知道谷歌搜索什么关键字才能知道如何做到这一点。这里是否有一个常见的模式,并且受到基本框架的支持?还是我在重新发明轮子?

Jas*_*n S 6

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

注意:如果扩展到单个进程,这将创建多个单独的控制任务,这可能是不需要的。扩展需要外部数据库或队列以及任务框架(例如 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>"
Run Code Online (Sandbox Code Playgroud)