Procházet zdrojové kódy

消息发送机制

rambo před 4 měsíci
rodič
revize
9e0d234948

+ 12 - 0
python/api.py

@@ -645,6 +645,12 @@ async def process_handle_detail(request: Request, params: HandlerDetail):
                 msg_type="detail_result_progress",
             )
             return True
+        await sendAsyncMessage(
+            msg="开始处理详情页",
+            goods_arts=[],
+            status="开始处理详情页",
+            msg_type="detail_progress",
+        )
         check_for_detail_first_res =  run_main.check_for_detail_first_call_back(
             return_data_check_before_detail
         )
@@ -655,6 +661,12 @@ async def process_handle_detail(request: Request, params: HandlerDetail):
             except:
                 config_data = result
         if config_data["sign_text"] == "已结束详情处理":
+            await sendAsyncMessage(
+                msg="详情页处理结束",
+                goods_arts=[],
+                status="详情页处理结束",
+                msg_type="detail_progress",
+            )
             print("config_data", config_data)
             out_put_dir = config_data.get("out_put_dir")
             if out_put_dir == None:

+ 46 - 8
python/custom_plugins/plugins_mode/detail_generate_base.py

@@ -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):

+ 0 - 17
python/service/run_main.py

@@ -956,23 +956,6 @@ class RunMain:
                     out_put_dir_resp = "{}/详情模板{}/{}".format(
                         out_put_dir, _temp_name, goods_no
                     )
-                    goods_art_nos = [
-                        item.get("货号", "")
-                        for item in temp_info_data.get("货号资料", [])
-                    ]
-                    asyncio.get_event_loop().create_task(
-                        sendSocketMessage(
-                            code=0,
-                            msg="开始处理详情",
-                            data={
-                                "goods_no": goods_no,
-                                "temp_name": _temp_name,
-                                "status": "进行中",
-                                "goods_art_nos": goods_art_nos,
-                            },
-                            msg_type="detail_progress",
-                        )
-                    )
                     all_detail_path_list.append(
                         "{}/详情模板{}/{}".format(out_put_dir, _temp_name, goods_no)
                     )