|
|
@@ -16,24 +16,62 @@ from PIL import Image
|
|
|
import shutil
|
|
|
from service.base import get_images, check_path, get_image_mask
|
|
|
from natsort import ns, natsorted
|
|
|
+import threading
|
|
|
+from concurrent.futures import ThreadPoolExecutor
|
|
|
+from concurrent.futures import TimeoutError as THTimeoutError
|
|
|
+
|
|
|
|
|
|
# import math
|
|
|
from PIL import ImageFont
|
|
|
import settings
|
|
|
from settings import sendSocketMessage
|
|
|
+# 全局线程池
|
|
|
+_executor = ThreadPoolExecutor(max_workers=4)
|
|
|
+# 全局事件循环和线程
|
|
|
+_message_loop = None
|
|
|
+_message_thread = None
|
|
|
+def _start_message_loop():
|
|
|
+ """在单独线程中启动事件循环"""
|
|
|
+ global _message_loop
|
|
|
+ _message_loop = asyncio.new_event_loop()
|
|
|
+ asyncio.set_event_loop(_message_loop)
|
|
|
+ _message_loop.run_forever()
|
|
|
+
|
|
|
+
|
|
|
+def _init_message_thread():
|
|
|
+ """初始化消息线程"""
|
|
|
+ global _message_thread
|
|
|
+ if _message_thread is None or not _message_thread.is_alive():
|
|
|
+ _message_thread = threading.Thread(target=_start_message_loop, daemon=True)
|
|
|
+ _message_thread.start()
|
|
|
+
|
|
|
+
|
|
|
+# 初始化消息线程
|
|
|
+_init_message_thread()
|
|
|
|
|
|
|
|
|
def sendMessageAsync(code=0, msg="开始处理详情", data=None, msg_type="detail_progress"):
|
|
|
"""异步发送消息"""
|
|
|
- loop = asyncio.get_event_loop()
|
|
|
- loop.create_task(
|
|
|
- sendSocketMessage(
|
|
|
- code=code,
|
|
|
- msg=msg,
|
|
|
- data=data,
|
|
|
- msg_type=msg_type,
|
|
|
+
|
|
|
+ def _send_in_thread():
|
|
|
+ # 在消息线程中调度任务
|
|
|
+ future = asyncio.run_coroutine_threadsafe(
|
|
|
+ sendSocketMessage(
|
|
|
+ code=code,
|
|
|
+ msg=msg,
|
|
|
+ data=data,
|
|
|
+ msg_type=msg_type,
|
|
|
+ ),
|
|
|
+ _message_loop,
|
|
|
)
|
|
|
- )
|
|
|
+ # 可选:等待结果或设置超时
|
|
|
+ try:
|
|
|
+ result = future.result(timeout=5.0)
|
|
|
+ except THTimeoutError:
|
|
|
+ print("消息发送超时")
|
|
|
+
|
|
|
+ # 在线程中执行异步任务的调度
|
|
|
+ _send_in_thread()
|
|
|
|
|
|
|
|
|
class DetailBase(object):
|