tsk.monster
A cute little tsk runner.
Quick Start
Install:
Write a tskfile.py:
tskfile.py
from tsk_monster import tsk
def download_image():
yield tsk(
'wget -O large.jpg https://picsum.photos/200/300',
prods=['large.jpg'])
yield tsk(
'convert -resize 100x large.jpg small.jpg',
needs=['large.jpg'],
prods=['small.jpg'])
Run:
Parallel Execution
tsk.monster executes independent tasks in parallel and utilizes all available CPU cores on the machine. Here is an example:
tskfile.py
from tsk_monster import tsk
def download_images():
for i in range(10):
large = f'large_{i:02}.jpg'
small = f'small_{i:02}.jpg'
yield tsk(
f'wget -O {large} https://picsum.photos/200/300',
prods=[large])
yield tsk(
f'convert -resize 100x {large} {small}',
needs=[large],
prods=[small])
Prevent Unnecessary Work
There are three situations in which a task is executed:
- If any of the
prodsfiles are missing. - If any of the
needsfiles were updated since the last run. - If the
updtslist is not empty.
In all other situations, the task is considered up to date and is skipped.
In the following example, the first task will be executed only if the file lazy.txt is missing. The second task will always be executed (if yielded), and the third task will be executed only if lazy.txt was updated (touched) since the last run.
tskfile.py
from random import random
from tsk_monster import tsk
def lazy():
yield tsk(
'touch lazy.txt',
prods=['lazy.txt'])
if random() < 0.5:
yield tsk(
'touch lazy.txt',
updts=['lazy.txt'])
yield tsk(
'echo lazy.txt was updated',
needs=['lazy.txt'])
Dynamic Execution
tskfile.py
from functools import partial
from pathlib import Path
from PIL import Image
from tsk_monster import exist, tsk
def thumbnails():
def thumbnail(in_path: Path, out_path: Path):
img = Image.open(in_path)
img.thumbnail((100, 100))
img.save(out_path)
for in_path in Path('imgs').glob('*.jpg'):
out_path = Path('thumbs') / in_path.name
# Tells tsk.monster that this file exists
yield exist(in_path)
yield tsk(
partial(thumbnail, in_path, out_path),
needs=[in_path],
prods=[out_path])