Background Tasks¶
New in version 1.4.
Run scripts in the background.
This module allows your workflow to execute longer-running processes, e.g. updating the data cache from a webservice, in the background, allowing the workflow to remain responsive in Alfred.
For example, if your workflow requires up-to-date exchange rates, you might write a script update_exchange_rates.py to retrieve the data from the relevant webservice, and call it from your main workflow script:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | from workflow import Workflow, ICON_INFO
from workflow.background import run_in_background, is_running
def main(wf):
# Is cache over 1 hour old or non-existent?
if not wf.cached_data_fresh('exchange-rates', 3600):
run_in_background('update',
['/usr/bin/python',
wf.workflowfile('update_exchange_rates.py')])
# Add a notification if the script is running
if is_running('update'):
wf.add_item('Updating exchange rates...', icon=ICON_INFO)
# max_age=0 will return the cached data regardless of age
exchange_rates = wf.cached_data('exchage-rates', max_age=0)
# Display (possibly stale) cached data
if exchange_rates:
for rate in exchange_rates:
wf.add_item(rate)
# Send results to Alfred
wf.send_feedback()
if __name__ == '__main__':
wf = Workflow()
wf.run(main)
|
For a working example, see Part 2: A Distribution-Ready Pinboard Workflow.
API¶
- workflow.background.run_in_background(name, args, **kwargs)¶
Pickle arguments to cache file, then call this script again via subprocess.call().
Parameters: - name (unicode) – name of task
- args – arguments passed as first argument to subprocess.call()
- **kwargs – keyword arguments to subprocess.call()
Returns: exit code of sub-process
Return type: int
When you call this function, it caches its arguments and then calls background.py in a subprocess. The Python subprocess will load the cached arguments, fork into the background, and then run the command you specified.
This function will return as soon as the background.py subprocess has forked, returning the exit code of that process (i.e. not of the command you’re trying to run).
If that process fails, an error will be written to the log file.
If a process is already running under the same name, this function will return immediately and will not run the specified command.
- workflow.background.is_running(name)¶
Test whether task is running under name
Parameters: name (unicode) – name of task Returns: True if task with name name is running, else False Return type: Boolean