def close_all(self): tasks = self._active_tasks[:] # this must be set after getting active tasks as it causes # thread objects to get out of the list too soon self._serving = False if tasks and hasattr(tasks[0], 'terminate'): for t in tasks: try: t.terminate() except OSError: err = sys.exc_info()[1] if err.errno != errno.ESRCH: raise for t in tasks: if t.is_alive(): t.join() del self._active_tasks[:] _FTPServer.close_all(self)