Lesson 9: Execution Wires

Intermediate

In a pure dataflow graph, nodes execute as soon as their inputs are ready. That works well for computation, but what about side effects that must happen in a specific order? Execution wires solve this problem.

When data flow isn’t enough

Consider logging two messages. Both log nodes have their input ready at the same time, so the runtime is free to execute them in any order. If you need “Hello” to always print before “World”, data flow alone cannot guarantee that.

  constant "Hello" --> log    (could run second)
  constant "World" --> log    (could run first)

What execution wires look like

Execution wires are drawn as dashed gray lines on the canvas. They connect an execution output pin on one node to an execution input pin on another. Unlike data wires, execution wires carry no value — they are pure sequencing signals.

  constant "Hello" --> log ===> log <-- constant "World"
                         (exec wire, dashed gray)

The second log will not fire until the first one has finished, regardless of whether its data input is already available.

How execution wires interact with data

A node with an execution input waits for both conditions:

  1. All data inputs are ready (normal dataflow rule).
  2. The execution wire has fired (the upstream node completed).

This means execution wires add ordering constraints on top of the dataflow schedule without replacing it.

Common use cases

  http-get --> json-parse --> transform ===> db-insert ===> log "done"
                                         (exec)        (exec)

What you learned