Nodes/Comfyui-zhenzhen/Concurrent Collect Images (30)
ComfyUI Node

Concurrent Collect Images (30)

Collecting a 30-wide image batch

By T8mars·Created about a year ago·Updated 2 days ago· 740
Concurrent Collect Images (30)
  • task_1
  • task_2
  • task_3
  • task_4
  • task_5
  • task_6
  • task_7
  • task_8
  • task_9
  • task_10
  • task_11
  • task_12
  • task_13
  • task_14
  • task_15
  • task_16
  • task_17
  • task_18
  • task_19
  • task_20
  • task_21
  • task_22
  • task_23
  • task_24
  • task_25
  • task_26
  • task_27
  • task_28
  • task_29
  • task_30
  • image_1
  • image_2
  • image_3
  • image_4
  • image_5
  • image_6
  • image_7
  • image_8
  • image_9
  • image_10
  • image_11
  • image_12
  • image_13
  • image_14
  • image_15
  • image_16
  • image_17
  • image_18
  • image_19
  • image_20
  • image_21
  • image_22
  • image_23
  • image_24
  • image_25
  • image_26
  • image_27
  • image_28
  • image_29
  • image_30
  • status
failure_modefail_fast

This is the node that makes every Concurrent Submit node in the pack make sense. ComflyConcurrent_Image_Await - displayed as Concurrent Collect Images (30) - is the receiving end of the pattern: the Submit nodes fire cloud jobs into a 30-worker pool and hand you task futures; this node waits for all of them and hands back real images. No Await node, no images. It's the collector, and it's an output node - you queue the batch, it holds the line until the pool drains, then you save.

It's also the place where the whole concurrency story becomes visible, because the pool size is right in the name: 30 image workers. Queue 30 Submit nodes, they run in parallel, and this node restores them to the order you connected them. The pack's README (2026085-1) says it plainly: search "Concurrent" in the node menu and you get the whole family - this collector plus a Submit variant for every eligible image/video node.

How it works

You connect task_1 through task_30 (only task_1 is required; unconnected slots report not_connected). Each is a COMFLY_IMAGE_FUTURE from any image Submit node in the pack - they can be a mix of different models, since the pool is shared. On execution the node waits on all pending futures with a ComfyUI progress bar, then hands back:

  • image_1 … image_30 - IMAGE tensors in the exact slot order of their tasks.
  • status - a JSON string describing every slot: not_connected, pending, success, or failed (with the error message, sanitized so it doesn't leak your key or URLs).

The failure_mode input decides what happens when a slot fails:

  • fail_fast (default) - the first failure cancels the remaining queued tasks and raises. You learn about the problem immediately, but you eat the already-submitted work.
  • placeholder - failures are replaced with a placeholder (a small flat-color image) and the run completes. You get all 30 slots filled and read the status JSON to find the dead ones. Better for "don't waste my batch" workflows.

IS_CHANGED returns NaN, which is ComfyUI-speak for "this node always re-runs" - the collector re-polls its tasks every queue, exactly what you want for a wait node.

Inputs and outputs, briefly

  • task_1 (required) and task_2–task_30 (optional) - COMFLY_IMAGE_FUTURE inputs from the Submit nodes.
  • failure_mode - fail_fast / placeholder.
  • image_1…image_30 - IMAGE outputs, slot-ordered.
  • status - STRING summary JSON.

Install

It ships with the pack - no separate install:

cd ComfyUI/custom_nodes
git clone https://github.com/T8mars/Comfyui-zhenzhen

or ComfyUI Manager → search "Comfyui-zhenzhen" → install → restart.

Where people get burned

  • Task futures are not images. The most common mistake in the entire family: wiring a Submit node's task straight into a Save Image node. It has to pass through the collector first.
  • fail_fast can nuke a good batch. One flaky slot and the whole queue cancels. If you're batch-heavy, placeholder is usually the better default - you still get your good images, and status tells you which to re-run.
  • The collector re-runs every queue. Because it's a wait node with NaN IS_CHANGED, it re-polls even if nothing changed upstream. That's correct behavior, but it means an unmodified queue is not a free cache hit.
  • Sanitized errors. Failure messages redact API keys and URLs (deliberately - the source does this so a shared workflow doesn't leak your credentials in the error text). That's good for security and mildly annoying for debugging; the site's async-task list is the place to dig deeper.

One more security note that's worth its own sentence: this pack is arbitrary Python that carries API keys and phones home by design, and the collector is where a whole batch's worth of prompts and reference images converge. Keep your key out of shared workflow JSONs, and prefer installing from the official repo via Manager.

Categoryzhenzhen/Concurrent Collect

Inputs (31)

NameTypeDefaultDescription
task_1COMFLY_IMAGE_FUTURE
failure_modeCOMBOfail_fast2 options: fail_fast, placeholder
task_2optCOMFLY_IMAGE_FUTURE
task_3optCOMFLY_IMAGE_FUTURE
task_4optCOMFLY_IMAGE_FUTURE
task_5optCOMFLY_IMAGE_FUTURE
task_6optCOMFLY_IMAGE_FUTURE
task_7optCOMFLY_IMAGE_FUTURE
task_8optCOMFLY_IMAGE_FUTURE
task_9optCOMFLY_IMAGE_FUTURE
task_10optCOMFLY_IMAGE_FUTURE
task_11optCOMFLY_IMAGE_FUTURE
task_12optCOMFLY_IMAGE_FUTURE
task_13optCOMFLY_IMAGE_FUTURE
task_14optCOMFLY_IMAGE_FUTURE
task_15optCOMFLY_IMAGE_FUTURE
task_16optCOMFLY_IMAGE_FUTURE
task_17optCOMFLY_IMAGE_FUTURE
task_18optCOMFLY_IMAGE_FUTURE
task_19optCOMFLY_IMAGE_FUTURE
task_20optCOMFLY_IMAGE_FUTURE
task_21optCOMFLY_IMAGE_FUTURE
task_22optCOMFLY_IMAGE_FUTURE
task_23optCOMFLY_IMAGE_FUTURE
task_24optCOMFLY_IMAGE_FUTURE
task_25optCOMFLY_IMAGE_FUTURE
task_26optCOMFLY_IMAGE_FUTURE
task_27optCOMFLY_IMAGE_FUTURE
task_28optCOMFLY_IMAGE_FUTURE
task_29optCOMFLY_IMAGE_FUTURE
task_30optCOMFLY_IMAGE_FUTURE

Outputs (31)

NameTypeDescription
image_1IMAGE
image_2IMAGE
image_3IMAGE
image_4IMAGE
image_5IMAGE
image_6IMAGE
image_7IMAGE
image_8IMAGE
image_9IMAGE
image_10IMAGE
image_11IMAGE
image_12IMAGE
image_13IMAGE
image_14IMAGE
image_15IMAGE
image_16IMAGE
image_17IMAGE
image_18IMAGE
image_19IMAGE
image_20IMAGE
image_21IMAGE
image_22IMAGE
image_23IMAGE
image_24IMAGE
image_25IMAGE
image_26IMAGE
image_27IMAGE
image_28IMAGE
image_29IMAGE
image_30IMAGE
statusSTRING