繁体   English   中英

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

[英]How to run a background control task inside a Flask app?

语境

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

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

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

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

该项目

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

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

我有限制在 Python 中执行服务器部分。

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

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

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

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

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

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

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

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

但我不知道如何做到这一点。 我什至不知道 Google 用什么关键字来知道如何做到这一点。 这里是否有一种通用模式可以得到基本框架的支持? 还是我在重新发明轮子?

要在与 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>"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM