Skip to main content

Simple to use progress bar with subprocesses and threads.

Project description

MultiProgress: the enriched progress bar

A simple to use progress_bar in sub-processes or threads using rich. See the examples folder for more examples.

import time
import random
from concurrent.futures import ProcessPoolExecutor
from enriched_progress import MultiProgress, progress_bar


def do_work(n: int) -> int:
    sleep_for = random.randint(0, 2)
    for _ in progress_bar(
        range(1, n + 2), desc=f"Sleeping for {sleep_for} secs for each {n} iterations."
    ):
        time.sleep(sleep_for)
    return sleep_for


def demo():
    with ProcessPoolExecutor() as p, MultiProgress():
        print(list(p.map(do_work, range(10))))

Install

pip install multiprog

Using Other Rich Features

[!Note] The progress_bar function doesn't need to know about the MultiProgress instance. The only time the two components will need to share state is the case where multiple instances of MultiProgress are being used in the main process. In such cases you will use a key to send progress updates to the correct instance.

import time
from rich.console import Console, Group
from rich.live import Live
from rich.panel import Panel
from concurrent.futures import ProcessPoolExecutor, as_completed
from enriched_progress import MultiProgress, progress_bar
import random
import os


def work(status_name: str) -> str:
    for _ in progress_bar(
        range(random.randint(2, 40)),
        desc=f"Working on task for {status_name}",
        metrics_func=lambda: dict(pid=os.getpid()),
    ):
        time.sleep(random.random() * 2)
    return status_name


def demo():
    console = Console()
    status = console.status("Working on tasks...")
    with (
        ProcessPoolExecutor() as p,
        MultiProgress(transient=True)(live_mode=False) as mp,
        Live(Panel(Group(status, mp))),
    ):
        futures = [
            p.submit(work, status_name)
            for status_name in ("status1", "status2", "status3")
        ]
        done = []
        for f in as_completed(futures):
            done.append(f.result())
            status.update(f"[bold green]Done tasks: {','.join(done)}")
        status.update("[bold green]All are done!!!")


if __name__ == "__main__":
    demo()

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

multiprog-1.1.0.tar.gz (13.7 kB view details)

Uploaded Source

Built Distribution

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

multiprog-1.1.0-py3-none-any.whl (10.2 kB view details)

Uploaded Python 3

File details

Details for the file multiprog-1.1.0.tar.gz.

File metadata

  • Download URL: multiprog-1.1.0.tar.gz
  • Upload date:
  • Size: 13.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.6.6

File hashes

Hashes for multiprog-1.1.0.tar.gz
Algorithm Hash digest
SHA256 585a1b7c1e7862895b3562f8eb33953c21aba741700a2654c60201366d300674
MD5 7d3c9f9a25491fbafd1e20f998771fbe
BLAKE2b-256 30be9481ae747940809dd444fb6b22aa77dee3ca374a4073d16d9bf7a2151015

See more details on using hashes here.

File details

Details for the file multiprog-1.1.0-py3-none-any.whl.

File metadata

  • Download URL: multiprog-1.1.0-py3-none-any.whl
  • Upload date:
  • Size: 10.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.6.6

File hashes

Hashes for multiprog-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 43f893584e15dc3176dd87490647948503e40fe0ad8ba25558a343545fb4a019
MD5 e9d6840f76631e7c8c269d46631cf97f
BLAKE2b-256 88dbddc53b20e1aab2c3caeee82d52bbd60adb188f74086c67eca482fac81ccb

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