Source code for raytraverse.utility.tstqdm
# -*- coding: utf-8 -*-
# Copyright (c) 2019 Stephen Wasilewski
# =======================================================================
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# =======================================================================
"""progress bar"""
import shutil
from datetime import datetime
from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor
from concurrent.futures import wait, FIRST_COMPLETED
from multiprocessing import get_context
from tqdm import tqdm
from raytraverse import io
[docs]class TStqdm(tqdm):
def __init__(self, instance=None, tz=None, workers=False, position=0,
desc=None, ncols=100, cap=None, **kwargs):
if str(workers).lower() in ('thread', 't', 'threads'):
pool = ThreadPoolExecutor()
elif workers:
context = get_context('fork')
nproc = io.get_nproc(cap)
pool = ProcessPoolExecutor(nproc, mp_context=context)
else:
pool = None
self._instance = instance
self.loglevel = position
tf = "%H:%M:%S"
self.ts = datetime.now(tz=tz).strftime(tf)
self.pool = pool
self.wait = wait
self.FIRST_COMPLETED = FIRST_COMPLETED
if pool is None:
self.nworkers = 0
else:
self.nworkers = pool._max_workers
ncols = min(ncols, shutil.get_terminal_size().columns)
super().__init__(desc=self.ts_message(desc), position=position,
ncols=ncols, **kwargs)
[docs] def ts_message(self, s):
if self._instance is not None:
p = type(self._instance).__name__
else:
p = ""
if s is None:
s = f"{p}"
else:
s = f"{p} {s}"
s = f"{' | ' * self.loglevel} {s}"
return s
[docs] def write(self, s, file=None, end="\n", nolock=False):
super().write(self.ts_message(s), file, end, nolock)
[docs] def set_description(self, desc=None, refresh=True):
super().set_description(desc=self.ts_message(desc), refresh=refresh)