From 00b021d77b6d90a415fb77ae0fd4a6d8a4c67700 Mon Sep 17 00:00:00 2001 From: zombieyang Date: Sat, 31 May 2025 17:19:00 +0800 Subject: [PATCH] faster async call in get/send node & bugfix --- sdppp_python/comfy/nodes_legacy.py | 16 +++++++++------- .../modules/comfy/src/socket/WorkflowCallee.mts | 8 +++++--- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/sdppp_python/comfy/nodes_legacy.py b/sdppp_python/comfy/nodes_legacy.py index 9124382..d25e07a 100644 --- a/sdppp_python/comfy/nodes_legacy.py +++ b/sdppp_python/comfy/nodes_legacy.py @@ -9,6 +9,7 @@ from nodes import CLIPTextEncode, ConditioningConcat, ConditioningSetMask from ..apis import addImageCache from ..protocols.photoshop import ProtocolPhotoshop from .nodes import check_linked_in_prompt, sdppp_get_prompt_item_from_list, convert_mask_to_boundary, SDPPPOptional +import asyncio def define_comfyui_nodes_legacy(sdppp): def call_async_func_in_server_thread(coro, dontwait = False): @@ -18,6 +19,7 @@ def define_comfyui_nodes_legacy(sdppp): 'error': None } loop = sdppp.loop + async def do_call(): try: handle['result'] = await coro @@ -25,17 +27,17 @@ def define_comfyui_nodes_legacy(sdppp): handle['error'] = e finally: handle['done'] = True - loop.create_task(do_call()) + # 使用 run_coroutine_threadsafe 确保在 aiohttp 的线程中执行 + future = asyncio.run_coroutine_threadsafe(do_call(), loop) + if not dontwait: - while not handle['done']: - pass + # 等待任务完成 + future.result() if handle['error'] is not None: raise handle['error'] - else: - return handle['result'] - else: - return None + return handle['result'] + return None def parse_params(unique_id, prompt, layer_or_group, document=""): linked_style = check_linked_in_prompt(prompt, unique_id, 'layer_or_group') diff --git a/typescripts/modules/comfy/src/socket/WorkflowCallee.mts b/typescripts/modules/comfy/src/socket/WorkflowCallee.mts index 34e06d2..54d3161 100644 --- a/typescripts/modules/comfy/src/socket/WorkflowCallee.mts +++ b/typescripts/modules/comfy/src/socket/WorkflowCallee.mts @@ -90,8 +90,11 @@ export function WorkflowCalleeSocket(SocketClass: SocketConstructor) { // nodeErrors = formatNodeErrors(app.lastNodeErrors) // } - } catch (error) { + } catch (error: any) { hasAnyError = true + nodeErrors = { + '-1': error.message || error.stack || error.toString() + } } if (hasAnyError) { @@ -134,7 +137,6 @@ export function WorkflowCalleeSocket(SocketClass: SocketConstructor) { const bIsFavorite = favorites.includes(b); if (aIsFavorite && !bIsFavorite) return -1; if (!aIsFavorite && bIsFavorite) return 1; - console.log(a, b) return a.localeCompare(b); }); } catch (error) { @@ -295,7 +297,7 @@ function hijackQueuePrompt() { const originalQueuePrompt = api.queuePrompt; api.queuePrompt = async (...args: any[]) => { try { - const res = await originalQueuePrompt.apply(api, ...args) + const res = await originalQueuePrompt.call(api, ...args) queuePromptRecords.push({ error: null, result: res