# -*- coding: utf-8 - # # This file is part of gunicorn released under the MIT license. # See the NOTICE for more information. import os import re import sys import time import threading class Reloader(threading.Thread): def __init__(self, extra_files=None, interval=1, callback=None): super(Reloader, self).__init__() self.setDaemon(True) self._extra_files = set(extra_files or ()) self._extra_files_lock = threading.RLock() self._interval = interval self._callback = callback def add_extra_file(self, filename): with self._extra_files_lock: self._extra_files.add(filename) def get_files(self): fnames = [ re.sub('py[co]$', 'py', module.__file__) for module in list(sys.modules.values()) if hasattr(module, '__file__') ] with self._extra_files_lock: fnames.extend(self._extra_files) return fnames def run(self): mtimes = {} while True: for filename in self.get_files(): try: mtime = os.stat(filename).st_mtime except OSError: continue old_time = mtimes.get(filename) if old_time is None: mtimes[filename] = mtime continue elif mtime > old_time: if self._callback: self._callback(filename) time.sleep(self._interval)