def _check(self): """ 用于在定时器中运行,通过检测上次访问时间来及时的释放资源 """ now = get_time() if now - self._last_time >= 60: self._do_close()
def __init__(self, session_id, manager): Entity.__init__(self, session_id) self._attrs = dict() # 保存属性 self._last_time = get_time() # session的上次访问时间 self._session_manager = manager # 其所属的manager对象 self._timeout = DEFAULT_TIMEOUT # 超时时间 # 通过这个定时器来定时的检测sessoion的上次访问时间,如果超时了,那么将会移除session self._check_timer = gevent.get_hub().loop.timer(DEFAULT_TIMEOUT, DEFAULT_TIMEOUT) self._check_timer.start(self._check) # 启动超时的检测定时器
def __init__(self, session_id, manager): Entity.__init__(self, session_id) self._attrs = dict() # 保存属性 self._last_time = get_time() # session的上次访问时间 self._session_manager = manager # 其所属的manager对象 self._timeout = DEFAULT_TIMEOUT # 超时时间 # 通过这个定时器来定时的检测sessoion的上次访问时间,如果超时了,那么将会移除session self._check_timer = gevent.get_hub().loop.timer( DEFAULT_TIMEOUT, DEFAULT_TIMEOUT) self._check_timer.start(self._check) # 启动超时的检测定时器
def __init__(self, log_path): """ 远程会要求log节点进程创建一个这种entity,用于远程通过rpc方法来获取监控的日志的数据 注意:为了防止一些意外,会启动一个定时器,检测上次访问时间,如果很长时间都没有访问了,那么会自动 停止LogGetter对象,然后清除当前entity,主要为了在一些异常情况下能够关闭开启了的子进程,释放占用的资源 :param log_path: 日志的路径 """ Entity.__init__(self, _create_id()) self._log_path = log_path self._getter = LogGetter(log_path) self._last_time = get_time() # 用于记录上一次访问时间 self._check_timer = gevent.get_hub().loop.timer(40, 40) self._check_timer.start(self._check) # 用于检测上次访问时间的timer
def switch_out(self): """ 这里主要是要拦截因为执行的任务导致阻塞从而被切换出去的协程, 设置标志为,表示当前协程在执行任务额时候曾经阻塞过,记录切换出去的时间点,然后将当前 协程加入到协程池的阻塞队列里面,接受阻塞超时的监控,配合LetPool的_do_clear方法,用于在协程数量紧张的 时候直接清除那些阻塞超时的协程 通过这种方式防止一些因为特殊情况永久阻塞导致内存泄漏的情况 """ if self._task is not None: self._last_out_time = get_time() if not self._some_time_block: self._some_time_block = True self._add_block_thread(self)
def _do_clear(self): """ 用于在协程数量太多的时候清理一些阻塞了很长时间的业务,直接抛出异常 遍历所有阻塞的协程,然后计算一下他们阻塞的时间是不是以及功能超时了,如果超时了的话, 那么直接在协程上面抛出异常,用于中断任务的执行 """ self._is_sch_clear = False now_time = get_time() need_stop_thread = [] for thread in self._block_threads: last_time = thread.last_out_time if last_time and (now_time - last_time > MAX_BLOCKING_TIME): # 阻塞时间长度超标了 need_stop_thread.append(thread) for thread in need_stop_thread: thread.throw(Exception("4")) # 客户端在收到这种异常之后可以知道是因为服务器这边运行超时导致的
def __init__(self, log_path, content, time_out=10): """ :param log_path: 需要grep的文件路径,这里最好是使用绝对路径 :param content: 需要grep的内容 :param time_out: 子进程超时时间,防止grep消耗太多 """ Entity.__init__(self, _create_id()) self._log_path = log_path self._time_out = time_out self._content = content self._last_time = get_time() # 记录上次访问时间 # 创建一个定时器来检查上次访问时间,保证当前Entity一定会被释放 self._check_timer = gevent.get_hub().loop.timer(20, 20) self._check_timer.start(self._check) self._grep = Grep(log_path, content, time_out) # 代理这个的方法来获取grep的数据
def _check(self): """ 用于检查session的超时,如果session超时了,那么移除这个session """ if (get_time() - self._last_time) >= self._timeout: self.release()
def get_data(self): """ 远端会通过不断的调用这个方法来获取grep出来的数据和grep的状态 """ self._last_time = get_time() return self._grep.get_data()
def _check(self): """ 在定时器中检查上次访问时间,长时间没有访问了,需要释放当前entity """ if get_time() - self._last_time > 20: self.close()
def get_attr(self, k): """ 通过调用这个远程方法来获取保存在session的值,如果没有的话,那么将会返回None """ self._last_time = get_time() return self._attrs.get(k)
def set_attr(self, k, v): """ 调用这个远程方法来保存一些值到session上面来 """ self._last_time = get_time() self._attrs[k] = v
def get_data(self): """ 远端会不断的调用这个方法来获取当前日志的最新数据用于在web界面上显示 """ self._last_time = get_time() # 更新该方法的上次访问时间 return self._getter.get_data()