diff --git a/admin/dashboard/blueprints/contacts.py b/admin/dashboard/blueprints/contacts.py index 4b93c15..dbe11bd 100644 --- a/admin/dashboard/blueprints/contacts.py +++ b/admin/dashboard/blueprints/contacts.py @@ -1,4 +1,7 @@ import asyncio +import threading +from queue import Queue +from concurrent.futures import ThreadPoolExecutor from flask import Blueprint, render_template, jsonify, request, current_app from .auth import login_required @@ -7,6 +10,28 @@ from loguru import logger # 创建联系人管理蓝图 contacts_bp = Blueprint('contacts', __name__, url_prefix='/contacts') +# 创建线程池 +message_executor = ThreadPoolExecutor(max_workers=10) +message_queue = Queue() + +def process_message_queue(): + """后台处理消息队列的函数""" + while True: + try: + task = message_queue.get() + if task is None: + break + func, args, kwargs = task + loop = get_or_create_eventloop() + loop.run_until_complete(func(*args, **kwargs)) + except Exception as e: + logger.error(f"处理消息队列任务失败: {e}") + finally: + message_queue.task_done() + +# 启动消息处理线程 +message_thread = threading.Thread(target=process_message_queue, daemon=True) +message_thread.start() # 联系人管理页面 @contacts_bp.route('/') @@ -229,37 +254,30 @@ def api_send_message(): if not server or not server.client: return jsonify({'success': False, 'message': '机器人未初始化'}) - # 获取事件循环 - loop = get_or_create_eventloop() - - # 根据消息类型调用不同的发送方法 + # 根据消息类型将任务加入队列 if msg_type == 'text': - client_msg_id, create_time, new_msg_id = loop.run_until_complete( - server.client.send_text_message(wxid, content) - ) + message_queue.put(( + server.client.send_text_message, + (wxid, content), + {} + )) return jsonify({ 'success': True, - 'data': { - 'client_msg_id': client_msg_id, - 'create_time': create_time, - 'new_msg_id': new_msg_id - } + 'message': '消息已加入发送队列' }) elif msg_type == 'image': if 'file' not in request.files: return jsonify({'success': False, 'message': '未上传文件'}) file = request.files['file'] - client_msg_id, create_time, new_msg_id = loop.run_until_complete( - server.client.send_image_message(wxid, file.read()) - ) + message_queue.put(( + server.client.send_image_message, + (wxid, file.read()), + {} + )) return jsonify({ 'success': True, - 'data': { - 'client_msg_id': client_msg_id, - 'create_time': create_time, - 'new_msg_id': new_msg_id - } + 'message': '消息已加入发送队列' }) elif msg_type == 'voice': @@ -273,50 +291,44 @@ def api_send_message(): else: return jsonify({ 'success': False, - 'data': { - } + 'message': '不支持的音频格式' }) - client_msg_id, create_time, new_msg_id = loop.run_until_complete( - server.client.send_voice_message(wxid, file.read(), format=format_str) - ) + message_queue.put(( + server.client.send_voice_message, + (wxid, file.read()), + {'format': format_str} + )) return jsonify({ 'success': True, - 'data': { - 'client_msg_id': client_msg_id, - 'create_time': create_time, - 'new_msg_id': new_msg_id - } + 'message': '消息已加入发送队列' }) elif msg_type == 'video': if 'file' not in request.files: return jsonify({'success': False, 'message': '未上传文件'}) file = request.files['file'] - client_msg_id, new_msg_id = loop.run_until_complete( - server.client.send_video_message(wxid, file.read()) - ) + message_queue.put(( + server.client.send_video_message, + (wxid, file.read()), + {} + )) return jsonify({ 'success': True, - 'data': { - 'client_msg_id': client_msg_id, - 'new_msg_id': new_msg_id - } + 'message': '消息已加入发送队列' }) elif msg_type == 'link': url = content.get('url') title = content.get('title', '') description = content.get('description', '') - client_msg_id, create_time, new_msg_id = loop.run_until_complete( - server.client.send_link_message(wxid, url, title, description) - ) + message_queue.put(( + server.client.send_link_message, + (wxid, url, title, description), + {} + )) return jsonify({ 'success': True, - 'data': { - 'client_msg_id': client_msg_id, - 'create_time': create_time, - 'new_msg_id': new_msg_id - } + 'message': '消息已加入发送队列' }) else: