Skip to content

Instantly share code, notes, and snippets.

@zackshen
Created July 30, 2014 03:41
Show Gist options
  • Select an option

  • Save zackshen/017caacea4eb4c8433bb to your computer and use it in GitHub Desktop.

Select an option

Save zackshen/017caacea4eb4c8433bb to your computer and use it in GitHub Desktop.
import threading
import logging
logger = logging.getLogger('default')
class _TaskThread(threading.Thread):
def __init__(self, interval=1):
threading.Thread.__init__(self)
self._finished = threading.Event()
self._exited = threading.Event()
self._interval = interval
def shutdown(self):
self._finished.set()
def run(self):
while 1:
if self._finished.isSet():
self._exited.set()
return
self.task()
self._finished.wait(self._interval)
def wait_exit(self):
self._exited.wait()
def task(self):
pass
class Progress(_TaskThread):
def __init__(self, process_name, max_val=95, update_func=None):
super(Progress, self).__init__()
self._process_name = process_name
self._progress = 0
self._max_progress = max_val
self._update_func = update_func
def __enter__(self):
logger.info('%s start, progress 0%%' % self._process_name)
self._callback()
self.start()
return self
def __exit__(self, type_, value, traceback):
self._progress = self._max_progress
self.shutdown()
self._callback()
self.wait_exit()
logger.info('%s start, progress %d%%' % (self._process_name, self._progress))
def _callback(self):
if self._update_func:
self._update_func(self._progress)
def task(self):
delta = self._max_progress - self._progress
increment = float(delta) / 15
self._progress = min(self._progress+increment, self._max_progress)
self._callback()
logger.info('%s progress[%d%%]' % (self._process_name, self._progress))
@property
def val(self):
return self._progress
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment