Running Tasks in the Background¶
When running a Firework, the Firetasks are run sequentially in the main thread. One way to run a background thread would be to write a Firetask that spawns a new Thread to perform some work. However, FireWorks also has a built-in method to run background tasks via BackgroundTasks. Each BackgroundTask is run in its own thread, in parallel to the main Firetasks, and can be repeated at stated intervals.
BackgroundTasks parameters¶
BackgroundTasks have the following properties:
tasks - a list of Firetasks to execute in sequence. The Firetasks can read the initial spec of the Firework. Any action returned by Firetasks within a BackgroundTask is NOT interpreted (including instructions to store data).
num_launches - the total number of times to repeat the BackgroundTask. 0 or less indicates infinite repeats.
sleep_time - amount of time in seconds to sleep before repeating the BackgroundTask
run_on_finish - if True, the BackgroundTask will be run one last time at the end of the Firework
Setting one or more BackgroundTasks (via file)¶
The easiest way to set BackgroundTasks is via the Python code. However, if you are using flat files, you can define BackgroundTasks via the _background_tasks
reserved keyword in the FW spec:
spec:
_background_tasks:
- _fw_name: BackgroundTask
num_launches: 0
run_on_finish: false
sleep_time: 10
tasks:
- _fw_name: ScriptTask
script:
- echo "hello from BACKGROUND thread #1"
use_shell: true
- _fw_name: BackgroundTask
num_launches: 0
run_on_finish: true
sleep_time: 5
tasks:
- _fw_name: ScriptTask
script:
- echo "hello from BACKGROUND thread #2"
use_shell: true
_tasks:
- _fw_name: ScriptTask
script:
- echo "starting"; sleep 30; echo "ending"
use_shell: true
The specification above has two BackgroundTasks, one which repeats every 10 seconds and another which repeats every 5 seconds.
Setting one or more BackgroundTasks (via Python)¶
You can define a BackgroundTask via:
bg_task = BackgroundTask(ScriptTask.from_str('echo "hello from BACKGROUND thread"'), num_launches=0, sleep_time=5, run_on_finish=True)
and add it to a Firework via:
fw = Firework([my_firetasks], spec={'_background_tasks':[bg_task]})
Python example¶
The following code runs a script that, in the main thread, prints ‘starting’, sleeps, then prints ‘ending’. In separate threads, two background threads run at different intervals. The second BackgroundTask has run_on_finish
set to True, so it also runs after the main thread finishes:
from fireworks import Firework, FWorker, LaunchPad, ScriptTask
from fireworks.features.background_task import BackgroundTask
from fireworks.core.rocket_launcher import rapidfire
# set up the LaunchPad and reset it
launchpad = LaunchPad()
launchpad.reset('TODAYS DATE') # set TODAYS DATE to be something like 2014-02-10
firetask1 = ScriptTask.from_str('echo "starting"; sleep 30; echo "ending"')
bg_task1 = BackgroundTask(ScriptTask.from_str('echo "hello from BACKGROUND thread #1"'), sleep_time=10)
bg_task2 = BackgroundTask(ScriptTask.from_str('echo "hello from BACKGROUND thread #2"'), num_launches=0, sleep_time=5, run_on_finish=True)
# create the Firework consisting of a custom "Fibonacci" task
firework = Firework(firetask1, spec={'_background_tasks': [bg_task1, bg_task2]})
## store workflow and launch it locally
launchpad.add_wf(firework)
rapidfire(launchpad, FWorker())