You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python-Flask框架中运行永久后台进程并实现玩家连接通知

解决方案

一、将后台游戏进程整合进Flask应用

不用单独启动独立进程,直接用Python的threading模块在Flask启动时开启一个后台线程运行游戏主循环即可。这种方式能让游戏进程和Flask服务共享同一个游戏实例,无需额外处理进程间通信,实现起来更简便。

修改你的现有代码如下:

import sys
import json
import threading
import time
from flask import Flask, request, render_template

app = Flask(__name__)

from mf import gameplay

game = gameplay.Game()

# 后台游戏循环函数
def game_loop():
    while True:
        # 这里编写游戏事件推进逻辑,比如更新全局状态、处理AI行为、触发时间驱动事件等
        game.update_game_state()
        # 控制游戏更新频率,比如每秒执行一次
        time.sleep(1)

@app.route('/')
def index():
    return render_template('mainmap.html')

@app.route('/api', methods=['POST'])
def api():
    data_json = request.data.decode()
    data = json.loads(data_json)
    return game(data_json)

if __name__ == '__main__':
    # 启动后台游戏线程,daemon=True让线程随Flask主进程退出而终止
    game_thread = threading.Thread(target=game_loop, daemon=True)
    game_thread.start()
    # 启动Flask服务
    app.run('0.0.0.0', 5000, threaded=True)

注意:需要在你的gameplay.Game类中实现update_game_state()方法,用来处理无玩家连接时的游戏事件推进逻辑。

二、玩家(重新)连接时通知后台进程

有两种简便方式实现这个需求,根据你的场景选择即可:

方式1:直接在路由中触发游戏回调

在玩家访问的路由(首页或API接口)中,直接调用游戏实例的对应方法,触发玩家连接后的特定操作:

@app.route('/')
def index():
    # 通知游戏有玩家连接
    game.handle_player_connect()
    return render_template('mainmap.html')

@app.route('/api', methods=['POST'])
def api():
    data_json = request.data.decode()
    data = json.loads(data_json)
    # 针对玩家重连的请求,触发专属逻辑
    if data.get('action') == 'reconnect':
        game.handle_player_reconnect(data.get('player_id'))
    return game(data_json)

然后在gameplay.Game类中实现handle_player_connect()和handle_player_reconnect()方法,比如同步最新游戏状态给玩家、触发欢迎事件、恢复玩家之前的进度等。

方式2:用线程事件触发后台响应

如果需要后台游戏线程立即暂停常规逻辑,优先处理玩家连接事件,可以用threading.Event实现:

import threading

# 初始化游戏和连接事件
game = gameplay.Game()
player_connect_trigger = threading.Event()

def game_loop():
    while True:
        # 检查是否有玩家连接触发信号
        if player_connect_trigger.is_set():
            # 执行玩家连接后的专属操作
            game.process_player_connect()
            # 重置信号,等待下一次触发
            player_connect_trigger.clear()
        # 游戏常规状态更新
        game.update_game_state()
        time.sleep(1)

@app.route('/')
def index():
    # 触发玩家连接信号
    player_connect_trigger.set()
    return render_template('mainmap.html')

这种方式适合需要后台线程立即响应玩家连接的场景,比如实时同步玩家数据、触发即时互动事件。


内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 01:07:40