测试线程发送。防止阻塞
This commit is contained in:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user