Skip to main content

cross-process progress bars

Project description

mqdm: progress bars for multiprocessing

Pretty progress bars using rich, in your child processes.

Install

pip install mqdm

Normal tqdm-style progress bars

import mqdm

items = range(10)

# nested loop progress
for x in mqdm.mqdm(items):
    # your description can change for each item
    for y in mqdm.mqdm(items, desc=lambda y, i: f'item {x} {y}'):
        print(x, y)

Progress of work across worker pools

import mqdm
import time

def my_work(n, sleep, mqdm: mqdm.Bar):
    for i in mqdm(range(n), description=f'counting to {n}'):
        time.sleep(sleep)

# executes my task in a concurrent futures process pool
mqdm.pool(
    my_work,
    range(1, 10),
    sleep=1,
    n_workers=3,
)

alt text

Less high level please

Basically, the mechanics are this:

# use context manager to start background listener and message queue
with mqdm.mqdms() as pbars:
    # create progress bars and send them to the remote processes
    pool.submit(my_work, 1, mqdm=pbars.remote())
    pool.submit(my_work, 2, mqdm=pbars.remote())
    pool.submit(my_work, 3, mqdm=pbars.remote())

# your worker function can look like this
def my_work(n, sleep=1, mqdm: mqdm.Remote):
    # It takes a proxy mqdm instance that can create new progress bars
    for i in mqdm(range(n), description=f'counting to {n}'):
        time.sleep(sleep)
        mqdm.print("hi")

# or this
def my_work(n, sleep=1, mqdm: mqdm.Remote):
    import time
    with mqdm(description=f'counting to {n}', total=n) as pbar:
        for i in range(n):
            pbar.update(0.5, description=f'Im counting - {n}  ')
            time.sleep(sleep/2)
            pbar.update(0.5, description=f'Im counting - {n+0.5}')
            time.sleep(sleep/2)

And you can use it in a pool like this:

import mqdm
from concurrent.futures import ProcessPoolExecutor, as_completed

items = range(1, 10)

with ProcessPoolExecutor(max_workers=n_workers) as pool, mqdm.Bars() as pbars:
    futures = [
        pool.submit(my_work, i, pbar=pbars.remote())
        for i in items
    ]
    for f in as_completed(futures):
        print(f.result())

It works by spawning a background thread with a multiprocessing queue. The Bars instance listens for messages from the progress bar proxies in the child processes.

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

mqdm-1.1.0.tar.gz (19.8 kB view details)

Uploaded Source

File details

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

File metadata

  • Download URL: mqdm-1.1.0.tar.gz
  • Upload date:
  • Size: 19.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.11

File hashes

Hashes for mqdm-1.1.0.tar.gz
Algorithm Hash digest
SHA256 4761515c9bd99bc512ef41cd8457580e91c8a687bb82bca18a4c34366254ac6a
MD5 a10c0587d3010af9c42dd321eef580e2
BLAKE2b-256 5e20b95b55ce1a64673b9afc8ac08560158162c1112d110edd57315690cd14b0

See more details on using hashes here.

Supported by

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