How to influence the build order#
Important
This guide shows how to influence the order in which tasks are executed. The feature should be treated with caution since it might make projects work whose dependencies and products are not fully specified.
You can influence the order in which tasks are executed by assigning preferences to
tasks. Use @pytask.mark.try_first
to execute a task as
early as possible and @pytask.mark.try_last
to defer
execution.
Note
A little bit more background: Tasks, dependencies and products form a directed acyclic graph (DAG). A topological ordering determines the order in which tasks are executed such that tasks are not run until their predecessors have been executed. You should not assume a fixed ordering in which tasks are executed.
As an example, here are two tasks where the decorator ensures that the output of the second task is always shown before the output of the first task.
# Content of task_example.py
import pytask
def task_first():
print("I'm second.")
@pytask.mark.try_first
def task_second():
print("I'm first.")
The execution yields (use -s
to make the output visible in the terminal)
$ pytask -s
──────────────────────────── Start pytask session ────────────────────────────
Platform: win32 -- Python <span style="color: var(--termynal-blue)">3.10.0</span>, pytask <span style="color: var(--termynal-blue)">0.4.0</span>, pluggy <span style="color: var(--termynal-blue)">1.0.0</span>
Root: C:\Users\pytask-dev\git\my_project
Collected <span style="color: var(--termynal-blue)">2</span> task.
I'm first
I'm second
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━┓
┃ Task ┃ Outcome ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━┩
│ <span class="termynal-dim">task_example.py::</span>task_first │ <span class="termynal-success">.</span> │
│ <span class="termynal-dim">task_example.py::</span>task_second │ <span class="termynal-success">.</span> │
└───────────────────────────────┴─────────┘
<span class="termynal-dim">──────────────────────────────────────────────────────────────────────────────</span>
<span class="termynal-success">╭───────────</span> <span style="font-weight: bold;">Summary</span> <span class="termynal-success">────────────╮</span>
<span class="termynal-success">│</span> <span style="font-weight: bold;"> 2 Collected tasks </span> <span class="termynal-success">│</span>
<span class="termynal-success">│</span> <span class="termynal-success-textonly"> 2 Succeeded (100.0%) </span> <span class="termynal-success">│</span>
<span class="termynal-success">╰────────────────────────────────╯</span>
<span class="termynal-success">───────────────────────── Succeeded in 0.11 seconds ──────────────────────────</span>
Replacing pytask.mark.try_first()
with pytask.mark.try_last()
yields
# Content of task_example.py
import pytask
def task_first():
print("I'm second.")
@pytask.mark.try_last
def task_second():
print("I'm first.")
and
$ pytask -s
──────────────────────────── Start pytask session ────────────────────────────
Platform: win32 -- Python <span style="color: var(--termynal-blue)">3.10.0</span>, pytask <span style="color: var(--termynal-blue)">0.4.0</span>, pluggy <span style="color: var(--termynal-blue)">1.0.0</span>
Root: C:\Users\pytask-dev\git\my_project
Collected <span style="color: var(--termynal-blue)">2</span> task.
I'm second
I'm first
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━┓
┃ Task ┃ Outcome ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━┩
│ <span class="termynal-dim">task_example.py::</span>task_first │ <span class="termynal-success">.</span> │
│ <span class="termynal-dim">task_example.py::</span>task_second │ <span class="termynal-success">.</span> │
└───────────────────────────────┴─────────┘
<span class="termynal-dim">──────────────────────────────────────────────────────────────────────────────</span>
<span class="termynal-success">╭───────────</span> <span style="font-weight: bold;">Summary</span> <span class="termynal-success">────────────╮</span>
<span class="termynal-success">│</span> <span style="font-weight: bold;"> 2 Collected tasks </span> <span class="termynal-success">│</span>
<span class="termynal-success">│</span> <span class="termynal-success-textonly"> 2 Succeeded (100.0%) </span> <span class="termynal-success">│</span>
<span class="termynal-success">╰────────────────────────────────╯</span>
<span class="termynal-success">───────────────────────── Succeeded in 0.11 seconds ──────────────────────────</span>