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_barfunction doesn't need to know about theMultiProgressinstance. The only time the two components will need to share state is the case where multiple instances ofMultiProgressare being used in the main process. In such cases you will use akeyto 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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
585a1b7c1e7862895b3562f8eb33953c21aba741700a2654c60201366d300674
|
|
| MD5 |
7d3c9f9a25491fbafd1e20f998771fbe
|
|
| BLAKE2b-256 |
30be9481ae747940809dd444fb6b22aa77dee3ca374a4073d16d9bf7a2151015
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
43f893584e15dc3176dd87490647948503e40fe0ad8ba25558a343545fb4a019
|
|
| MD5 |
e9d6840f76631e7c8c269d46631cf97f
|
|
| BLAKE2b-256 |
88dbddc53b20e1aab2c3caeee82d52bbd60adb188f74086c67eca482fac81ccb
|