Concurrent Collect Images (30)
Collecting a 30-wide image batch
- 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
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 -
IMAGEtensors in the exact slot order of their tasks. - status - a JSON string describing every slot:
not_connected,pending,success, orfailed(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
statusJSON 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_FUTUREinputs from the Submit nodes. - failure_mode -
fail_fast/placeholder. - image_1…image_30 -
IMAGEoutputs, slot-ordered. - status -
STRINGsummary 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
taskstraight 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,
placeholderis usually the better default - you still get your good images, andstatustells 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.
Inputs (31)
| Name | Type | Default | Description |
|---|---|---|---|
| task_1 | COMFLY_IMAGE_FUTURE | — | |
| failure_mode | COMBO | fail_fast | 2 options: fail_fast, placeholder |
| task_2opt | COMFLY_IMAGE_FUTURE | — | |
| task_3opt | COMFLY_IMAGE_FUTURE | — | |
| task_4opt | COMFLY_IMAGE_FUTURE | — | |
| task_5opt | COMFLY_IMAGE_FUTURE | — | |
| task_6opt | COMFLY_IMAGE_FUTURE | — | |
| task_7opt | COMFLY_IMAGE_FUTURE | — | |
| task_8opt | COMFLY_IMAGE_FUTURE | — | |
| task_9opt | COMFLY_IMAGE_FUTURE | — | |
| task_10opt | COMFLY_IMAGE_FUTURE | — | |
| task_11opt | COMFLY_IMAGE_FUTURE | — | |
| task_12opt | COMFLY_IMAGE_FUTURE | — | |
| task_13opt | COMFLY_IMAGE_FUTURE | — | |
| task_14opt | COMFLY_IMAGE_FUTURE | — | |
| task_15opt | COMFLY_IMAGE_FUTURE | — | |
| task_16opt | COMFLY_IMAGE_FUTURE | — | |
| task_17opt | COMFLY_IMAGE_FUTURE | — | |
| task_18opt | COMFLY_IMAGE_FUTURE | — | |
| task_19opt | COMFLY_IMAGE_FUTURE | — | |
| task_20opt | COMFLY_IMAGE_FUTURE | — | |
| task_21opt | COMFLY_IMAGE_FUTURE | — | |
| task_22opt | COMFLY_IMAGE_FUTURE | — | |
| task_23opt | COMFLY_IMAGE_FUTURE | — | |
| task_24opt | COMFLY_IMAGE_FUTURE | — | |
| task_25opt | COMFLY_IMAGE_FUTURE | — | |
| task_26opt | COMFLY_IMAGE_FUTURE | — | |
| task_27opt | COMFLY_IMAGE_FUTURE | — | |
| task_28opt | COMFLY_IMAGE_FUTURE | — | |
| task_29opt | COMFLY_IMAGE_FUTURE | — | |
| task_30opt | COMFLY_IMAGE_FUTURE | — |
Outputs (31)
| Name | Type | Description |
|---|---|---|
| image_1 | IMAGE | — |
| image_2 | IMAGE | — |
| image_3 | IMAGE | — |
| image_4 | IMAGE | — |
| image_5 | IMAGE | — |
| image_6 | IMAGE | — |
| image_7 | IMAGE | — |
| image_8 | IMAGE | — |
| image_9 | IMAGE | — |
| image_10 | IMAGE | — |
| image_11 | IMAGE | — |
| image_12 | IMAGE | — |
| image_13 | IMAGE | — |
| image_14 | IMAGE | — |
| image_15 | IMAGE | — |
| image_16 | IMAGE | — |
| image_17 | IMAGE | — |
| image_18 | IMAGE | — |
| image_19 | IMAGE | — |
| image_20 | IMAGE | — |
| image_21 | IMAGE | — |
| image_22 | IMAGE | — |
| image_23 | IMAGE | — |
| image_24 | IMAGE | — |
| image_25 | IMAGE | — |
| image_26 | IMAGE | — |
| image_27 | IMAGE | — |
| image_28 | IMAGE | — |
| image_29 | IMAGE | — |
| image_30 | IMAGE | — |
| status | STRING | — |