1. ComfyUI API 异步任务处理的核心机制
第一次接触 ComfyUI API 时,最让我头疼的就是如何可靠地获取图像生成结果。传统的同步请求方式在这里完全不适用,因为图像生成可能需要几秒到几分钟不等。经过多次实践,我发现这套基于 WebSocket 的异步机制才是解决问题的关键。
ComfyUI 的任务处理流程可以类比为餐厅点餐:当你提交 prompt(点单)后,服务员(API)会给你一个订单号(prompt_id),然后厨房(计算节点)开始制作。在这个过程中,你可以通过订单号随时查询进度,而 WebSocket 就像餐厅的电子显示屏,实时推送订单状态更新。这种设计完美解决了长时任务阻塞请求的问题。
实际开发中最实用的就是这个执行状态监听机制。当我们在代码中看到这样的输出时:
python复制{
'type': 'executing',
'data': {
'node': None,
'prompt_id': '你的任务ID'
}
}
就表示整个流程已经执行完毕。这个设计巧妙之处在于,它既保持了 HTTP 接口的简洁性,又通过 WebSocket 实现了实时状态更新。我在项目中实测下来,这种组合方式比纯轮询效率高出 3-5 倍,特别是在处理批量任务时优势更加明显。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 构建完整的图像生成工作流
2.1 初始化连接与任务提交
搭建自动化服务的第一步是建立稳定的连接。这里有个容易踩坑的地方:WebSocket 连接需要先于 HTTP 请求建立。我推荐使用这样的初始化顺序:
python复制import websocket
import uuid
# 生成唯一客户端ID
client_id = str(uuid.uuid4())
# 先建立WebSocket连接
ws = websocket.WebSocket()
ws.connect(f"ws://127.0.0.1:8188/ws?clientId={client_id}")
# 再发送HTTP请求
prompt = {"3": {"class_type": "KSampler", "inputs": {...}}}
response = queue_prompt(prompt) # 返回包含prompt_id的响应
特别要注意的是 client_id 的生成。早期版本我使用简单的时间戳,结果在高并发时出现了冲突。改用 UUID 后,即使同时发起 100+ 请求也能稳定运行。
2.2 状态监听与结果获取
状态监听的核心逻辑其实就是一个消息循环,这里分享一个经过生产验证的改进版本:
python复制def wait_for_completion(ws, prompt_id):
while True:
message = json.loads(ws.recv())
if message['type'] == 'status':
print(f"系统状态: {message['data']['status']}")
elif message['type'] == 'executing':
data = message['data']
