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

Python Flask应用部署到Azure后线程无法运行的问题求助

问题描述

我的代码在localhost(本地主机)上运行正常,但部署到Azure后线程无法工作。代码示例如下:

from flask import Flask, request
from side import querying, send_message
import json
from threading import Thread

app = Flask(__name__)

@app.route('/chat', methods=['POST'])
def chat():
    body = json.loads(request.data.decode())['body']
    category = json.loads(request.data.decode())['category']
    phone = json.loads(request.data.decode())['phone']

    def do_work(body, category, phone):
        answer = querying(body, category)
        send_message(phone, answer)

    thread = Thread(target=do_work, kwargs={'body': body, "category":category, "phone":phone})
    thread.start()
    return 'started'


if __name__ == '__main__':
    app.run(host='0.0.0.0', debug=False, port=5000)
解决方案

核心原因

Azure App Service的WSGI服务器(如Gunicorn)会在请求结束后回收进程资源,导致你创建的子线程未完成执行就被终止;另外,App Service的休眠机制也会杀死后台线程。以下是可行的解决办法:

  • 用异步任务队列替代直接创建线程
    自行管理的线程在Azure环境下稳定性差,建议用任务队列解耦请求和任务执行。以Azure Queue Storage为例:

    1. 在Azure门户创建Queue Storage服务,获取连接字符串
    2. 修改Flask接口将任务参数存入队列
    3. 单独编写任务处理逻辑(可部署为独立服务或Azure Functions)

    修改后的示例代码:

    from flask import Flask, request
    from side import querying, send_message
    import json
    from azure.storage.queue import QueueServiceClient
    
    app = Flask(__name__)
    # 替换为你的Azure Queue连接字符串
    queue_service = QueueServiceClient.from_connection_string("YOUR_CONNECTION_STRING")
    queue_client = queue_service.get_queue_client("chat-tasks")
    
    @app.route('/chat', methods=['POST'])
    def chat():
        payload = json.loads(request.data.decode())
        # 将任务消息存入队列
        task_msg = json.dumps({
            "body": payload['body'],
            "category": payload['category'],
            "phone": payload['phone']
        })
        queue_client.send_message(task_msg)
        return 'task queued'
    
    # 任务处理逻辑(可独立运行或部署为Azure Function)
    def process_tasks():
        while True:
            messages = queue_client.receive_messages()
            for msg in messages:
                task_data = json.loads(msg.content)
                answer = querying(task_data['body'], task_data['category'])
                send_message(task_data['phone'], answer)
                queue_client.delete_message(msg)
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0', debug=False, port=5000)
    
  • 开启App Service的Always On设置
    在Azure门户进入你的App Service,找到「配置」-「常规设置」,开启Always On选项,防止应用休眠导致后台线程被杀死。

  • 改用Azure Functions
    如果业务核心是处理异步聊天任务,Azure Functions更适配Azure环境,它原生支持异步执行,无需手动管理线程和进程,只需编写触发逻辑和任务处理代码即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 18:54:55