How to write a while loop?#
A while loop consists of a branch, and a condition task inside this branch, which determines whether one revisits the branch again.
One needs to define the branch with loop=True, and then make sure that there if one _if decorator, with a jump back to the branch itself.
We begin from empty repo.
$ tb init
Created repository using module "taskblaster.repository" in "/home/me/repo".
Here is the simplest example workflow. Create a following workflow.py
import taskblaster as tb
@tb.workflow
class WhileLoopWorkflow:
number = tb.var()
@tb.branch('entry', loop=True)
@tb.task
def iterate(self):
return tb.node(
'iterate_task',
number=self.Phi(default=self.number, entry=self.iterate),
)
@tb.branch('entry', loop=True)
@tb._if(false='entry')
@tb.task
def converged(self):
return tb.node('converged_task', number=self.iterate)
def workflow(rn):
rn.run_workflow(WhileLoopWorkflow(number=3))
and a following tasks.py
def converged_task(number):
return number < 1
def iterate_task(number):
return number - 1
This is the absolutely simplest example of workflow. The Phi-operator argument default refers to
initialization of the while loop, i.e. on the first iteration, we get the input to the iterate task
from the workflow input self.number. On the next step, we are coming from entry-branch,
and thus we will refer to the previous result of the iterate.
We can iterate the workflow few times and observe the results
$ tb workflow workflow.py && tb run . >/dev/null && tb ls --sort=topo -c sirITfo entry: add new 0/0 tree/iterate-001 if: add new 0/1 tree/converged-001 T=None F=entry add: 2 state info tags worker time folder output ──────── ────────── ─────────── ─────────── ─────────── ────────────────────────────────────────────────── ──────────────────────── done 0/0 N/A 00:00:00 tree/iterate-001 2 done 1/1 N/A 00:00:00 tree/converged-001 False
$ tb workflow workflow.py && tb run . >/dev/null && tb ls --sort=topo -c sirITfo entry: have done 0/0 tree/iterate-001 if: have done 1/1 tree/converged-001 T=None F=entry jump: entry entry: add new 2/2 tree/iterate-002 if: add new 1/2 tree/converged-002 T=None F=entry add: 2, have: 2 state info tags worker time folder output ──────── ────────── ─────────── ─────────── ─────────── ────────────────────────────────────────────────── ──────────────────────── done 0/0 N/A 00:00:00 tree/iterate-001 2 done 1/1 N/A 00:00:00 tree/converged-001 False done 2/2 N/A 00:00:00 tree/iterate-002 1 done 2/2 N/A 00:00:00 tree/converged-002 False
$ tb workflow workflow.py && tb run . >/dev/null && tb ls --sort=topo -c sirITfo entry: have done 0/0 tree/iterate-001 if: have done 1/1 tree/converged-001 T=None F=entry jump: entry entry: have done 2/2 tree/iterate-002 if: have done 2/2 tree/converged-002 T=None F=entry jump: entry entry: add new 3/3 tree/iterate-003 if: add new 2/3 tree/converged-003 T=None F=entry add: 2, have: 4 state info tags worker time folder output ──────── ────────── ─────────── ─────────── ─────────── ────────────────────────────────────────────────── ──────────────────────── done 0/0 N/A 00:00:00 tree/iterate-001 2 done 1/1 N/A 00:00:00 tree/converged-001 False done 2/2 N/A 00:00:00 tree/iterate-002 1 done 2/2 N/A 00:00:00 tree/converged-002 False done 3/3 N/A 00:00:00 tree/iterate-003 0 done 3/3 N/A 00:00:00 tree/converged-003 True
To view an experimental automatically generated workflow diagram of the workflow here, click here.
This structure is the simplest for loop. However, to make the initialization and finalization of while loop more clear, and usable, see How to write a practical while loop How to.