Skip to main content

Zero-dependency parallel script runner.

Project description

π〽️❗: pi-line

A zero-dependency parallel script runner for Python.

Define units of work (Pi), execute them in parallel with a Runner, or feed them continuously through a Line.

Install

pip install pi-line

Quick start

Run scripts in parallel

from piline import Pi, Runner

pis = [
    Pi(name="train", script="train.py", args=["--epochs", "10"]),
    Pi(name="eval", script="eval.py"),
]

runner = Runner(max_workers=4)
results = runner.run(pis)

for r in results:
    print(f"{r.pi_name}: {'PASS' if r.succeeded else 'FAIL'}")

Continuous feed with a Line

from piline import Pi, Runner, Line

runner = Runner(max_workers=4)

with Line(runner, max_results=5000) as line:
    line.put(Pi(name="job1", script="job.py"))
    line.put(Pi(name="job2", script="job.py"))

    # look up a result by id
    result = line.get(pi_id)

    # flush results to external storage
    batch = line.drain_results()
# line.stop() called automatically

Argument templates

Use {artefact_dir} and {task_dir} placeholders in args — they get resolved to the real paths before execution:

Pi(
    name="train",
    script="train.py",
    args=["--output", "{artefact_dir}/model.pt"],
)

Concepts

  • Pi — A unit of work. Wraps a script with args, env vars, and an optional timeout. Gets a unique ID on creation. .py files run with Python; anything else runs directly.
  • Result — Outcome of running a Pi. Exit code, timing, paths to stdout/stderr logs and artefacts.
  • Runner — Executes a batch of Pi's in parallel using ProcessPoolExecutor.
  • Line — Thread-safe queue that feeds Pi's to a Runner in batches. Results stored in a capped dict keyed by pi_id. Supports context manager, per-Pi and per-batch callbacks, and drain_results() for periodic flushing.

Output layout

.piline/runs/<pi_name>/<pi_id>/
    stdout.log
    stderr.log
    artefact/

Environment variables

Scripts receive these env vars automatically:

  • PILINE_PI_ID — The Pi's unique ID
  • PILINE_PI_NAME — The Pi's name
  • PILINE_TASK_DIR — Path to the task directory
  • PILINE_ARTEFACT_DIR — Path to the artefact subdirectory

Callbacks

Line(
    runner,
    on_pi_complete=lambda r: print(f"Done: {r.pi_name} ({'PASS' if r.succeeded else 'FAIL'})"),
    on_batch_complete=lambda results: print(f"Batch of {len(results)} finished"),
)

API reference

See docs/index.md.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pi_line-1.0.0.tar.gz (13.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pi_line-1.0.0-py3-none-any.whl (11.4 kB view details)

Uploaded Python 3

File details

Details for the file pi_line-1.0.0.tar.gz.

File metadata

  • Download URL: pi_line-1.0.0.tar.gz
  • Upload date:
  • Size: 13.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for pi_line-1.0.0.tar.gz
Algorithm Hash digest
SHA256 3d05606baf02c27206574878212fb01699428c80cd896aa3c00290af8782e3f1
MD5 322ef0e8071ca9b61e5b512eb820ce42
BLAKE2b-256 27fe6092b59ca0a31e5ec03834643af6f7d4e2f1352e5627ba7a6dd94d8ab167

See more details on using hashes here.

File details

Details for the file pi_line-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: pi_line-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 11.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for pi_line-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 342aa6b82b6237ccdb14d5364f5e129a483a6b374c8cf4fdbb7a4d940a19d691
MD5 7a2e4e53a57bb5dadc445f73a3cf3449
BLAKE2b-256 78f38d7144a7c26b35c5f0e32206948f1da1b2cf86fefe18f8bc5cc1a68ea474

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page