-
Notifications
You must be signed in to change notification settings - Fork 166
Description
fork
& join
Similar to fork()
in programming there is an implicit notion of join()
in the workflow DSL. Namely when all branches (of a non-competing fork) finish:
document: {}
do:
- forkExample:
branches:
- a: {}
- b:
do:
- b1: {}
- b2: {}
- c: {}
- d: {}
The corresponding state diagram would look like this:
stateDiagram-v2
state fork_state <<fork>>
state join_state <<join>>
[*] --> fork_state
fork_state --> a
fork_state --> b1
fork_state --> c
b1 --> b2
a --> join_state
b2 --> join_state
c --> join_state
join_state --> d
d --> [*]
Here the first bar represent a fork
and the second a join
. Task d
would only run after a
, b1
, b2
and c
have finished.
However the current state of the specification does not enumerate all cases, or at least leaves a lot implicitly defined:
then
in neighboring branch
The following definition jumps from one (b
) branch to another (a
):
document: {}
do:
- forkExample:
branches:
- a:
do:
- a1: {}
- a2: {}
- b:
do:
- b1:
then: a2
- d: {}
stateDiagram-v2
state fork_state <<fork>>
state join_state <<join>>
[*] --> fork_state
fork_state --> a1
fork_state --> b1
state "a2" as a2_l
state "a2" as a2_r
b1 --> a2_l
a1 --> a2_r
a2_l --> join_state
a2_r --> join_state
join_state --> d
d --> [*]
In my understanding this would execute task a2
twice and proceed after both branches have finished. Or should something like this be disallowed?
then
outside of fork
Another case is when a task outside of fork
is referenced in then
. Here b
references d
document: {}
do:
- forkExample:
branches:
- a:
do:
- a1: {}
- a2: {}
- b:
then: d
- d: {}
- e: {}
stateDiagram-v2
state fork_state <<fork>>
state join_state <<join>>
[*] --> fork_state
fork_state --> a1
fork_state --> b
a1 --> a2
state "d" as d_in
state "e" as e_in
a2 --> join_state
b --> d_in
d_in --> e_in
e_in --> join_state
join_state --> d
d --> e
e --> [*]
In my understanding this would execute the whole chain of d --> e
twice as illustrated in the state diagram but the second run of d
& e
would wait for both branches to be done
Metadata
Metadata
Assignees
Labels
Type
Projects
Status