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为例:- 在Azure门户创建Queue Storage服务,获取连接字符串
- 修改Flask接口将任务参数存入队列
- 单独编写任务处理逻辑(可部署为独立服务或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
相关产品推荐
相关产品推荐

