def __init__( self, username=None, pwd=None, symbols=None, hq='hq_pjb', query=['quotation', 'transaction'], # ['quotation', 'orders', 'transaction', 'info'] on_recv_data=None, # 收到数据以后的回调函数 use_logger=True, **kwargs ): super().__init__(**kwargs) self.on_recv_data = on_recv_data # 回调函数 self.ip = util.get_client_ip() self.hq = hq self.query = query if use_logger: self.logger = util.get_logger(self.__class__.__name__) # 如果是dHydra框架内调用,则直接用框架内的Sina类, # 否则作为独立的类在外部调用 try: self.sina = get_vendor('Sina') except Exception as e: self.sina = Sina() self.is_login = self.login() if symbols is None: self.symbols = self.sina.get_symbols() else: self.symbols = symbols self.websockets = dict()
def run(self): """ 初始化Worker """ # 首先检查是否已经有相同的进程被开启 self.logger = util.get_logger( logger_name=self.__class__.__name__, log_path=self.__log_path__, # console_log=self.__console_log__, # 屏幕打印日志开关,默认True console_log_level=self.__console_log_level__, # 屏幕打印日志的级别,默认为INFO critical_log=self.__critical_log__, # critica单独l写文件日志,默认关闭 error_log=self.__error_log__, # error级别单独写文件日志,默认开启 warning_log=self.__warning_log__, # warning级别单独写日志,默认关闭 info_log=self.__info_log__, # info级别单独写日志,默认开启 debug_log=self.__debug_log__, # debug级别日志,默认关闭 ) if self.__is_unique__(): self.__status__ = "started" else: self.error_msg = "Duplicated Process" self.logger.warning(self.error_msg) sys.exit(0) return False # 开启监听命令线程 self.__thread_listen_command__ = threading.Thread( target=self.__listen_command__) self.__thread_listen_command__.setDaemon(True) self.monitor_add_thread(thread=self.__thread_listen_command__, description="Listening Command Channel", restart_mode="auto", restart_func=self.__auto_restart_thread__) self.__thread_listen_command__.start() # 检查初始化设置,按需开启 # PUB线程 self.__thread_pub__ = threading.Thread(target=self.__producer__) self.__thread_pub__.setDaemon(True) self.monitor_add_thread(thread=self.__thread_pub__, description="DATA PUBLISHER", restart_mode="auto", restart_func=self.__auto_restart_thread__) self.__thread_pub__.start() # LISTENER self.__thread_sub__ = threading.Thread(target=self.__consumer__) self.__thread_sub__.setDaemon(True) self.monitor_add_thread(thread=self.__thread_sub__, description="DATA CONSUMER", restart_mode="auto", restart_func=self.__auto_restart_thread__) self.__thread_sub__.start() while True: # heart beat self.__heart_beat__() time.sleep(self.__heart_beat_interval__)
def __init__( self, log_path="log", # console_log=True, # 屏幕打印日志开关,默认True console_log_level=logging.INFO, # 屏幕打印日志的级别,默认为INFO critical_log=False, # critica单独l写文件日志,默认关闭 error_log=True, # error级别单独写文件日志,默认开启 warning_log=False, # warning级别单独写日志,默认关闭 info_log=True, # info级别单独写日志,默认开启 debug_log=False, # debug级别日志,默认关闭 ): self.logger = util.get_logger( log_path=log_path, # console_log=console_log, # 屏幕打印日志开关,默认True console_log_level=console_log_level, # 屏幕打印日志的级别,默认为INFO critical_log=critical_log, # critica单独l写文件日志,默认关闭 error_log=error_log, # error级别单独写文件日志,默认开启 warning_log=warning_log, # warning级别单独写日志,默认关闭 info_log=info_log, # info级别单独写日志,默认开启 debug_log=debug_log, # debug级别日志,默认关闭 logger_name=self.__class__.__name__, )
def __on_start__(self): """ 进程开始运行时调用 :return: """ if self.check_prerequisites() is not True: sys.exit(0) self.init_redis() self.init_mongodb() # 实例化self.logger self.logger = util.get_logger( logger_name=self.__class__.__name__, log_path=self.__log_path__, # console_log=self.__console_log__, # 屏幕打印日志开关,默认True console_log_level=self.__console_log_level__, # 屏幕打印日志的级别,默认为INFO critical_log=self.__critical_log__, # critical写文件日志,默认关闭 error_log=self.__error_log__, # error级别单独写文件日志,默认开启 warning_log=self.__warning_log__, # warning级别单独写日志,默认关闭 info_log=self.__info_log__, # info级别单独写日志,默认开启 debug_log=self.__debug_log__, # debug级别日志,默认关闭 )
def __on_start__(self): """ 进程开始运行时调用 :return: """ if self.check_prerequisites() is not True: sys.exit(0) self.init_redis() self.init_mongodb() # 实例化self.logger self.logger = util.get_logger( logger_name=self.__class__.__name__, log_path=self.__log_path__, # console_log=self.__console_log__, # 屏幕打印日志开关,默认True console_log_level=self.__console_log_level__, # 屏幕打印日志的级别,默认为INFO critical_log=self.__critical_log__, # critica单独l写文件日志,默认关闭 error_log=self.__error_log__, # error级别单独写文件日志,默认开启 warning_log=self.__warning_log__, # warning级别单独写日志,默认关闭 info_log=self.__info_log__, # info级别单独写日志,默认开启 debug_log=self.__debug_log__, # debug级别日志,默认关闭 )
def __init__( self, log_path="log", # console_log=True, # 屏幕打印日志开关,默认True console_log_level=logging.INFO, # 屏幕打印日志的级别,默认为INFO critical_log=False, # critica单独l写文件日志,默认关闭 error_log=True, # error级别单独写文件日志,默认开启 warning_log=False, # warning级别单独写日志,默认关闭 info_log=True, # info级别单独写日志,默认开启 debug_log=False, # debug级别日志,默认关闭 **kwargs ): self.logger = util.get_logger( log_path=log_path, # console_log=console_log, # 屏幕打印日志开关,默认True console_log_level=console_log_level, # 屏幕打印日志的级别,默认为INFO critical_log=critical_log, # critica单独l写文件日志,默认关闭 error_log=error_log, # error级别单独写文件日志,默认开启 warning_log=warning_log, # warning级别单独写日志,默认关闭 info_log=info_log, # info级别单独写日志,默认开启 debug_log=debug_log, # debug级别日志,默认关闭 logger_name=self.__class__.__name__, )
def __init__( self, singleton=True, # 单例模式 nickname=None, # Worker的自定义名字 description="No Description", # 备注说明 heart_beat_interval=1, # 默认1秒心跳 log_path="log", # console_log=True, # 屏幕打印日志开关,默认True console_log_level=logging.INFO, # 屏幕打印日志的级别,默认为INFO critical_log=False, # critical单独写文件日志,默认关闭 error_log=True, # error级别单独写文件日志,默认开启 warning_log=False, # warning级别单独写日志,默认关闭 info_log=True, # info级别单独写日志,默认开启 debug_log=False, # debug级别日志,默认关闭 **kwargs ): super().__init__() # 记录日志配置 self.__log_path__ = log_path self.__console_log__ = console_log self.__console_log_level__ = console_log_level self.__critical_log__ = critical_log self.__error_log__ = error_log self.__warning_log__ = warning_log self.__info_log__ = info_log self.__debug_log__ = debug_log self.logger = util.get_logger( logger_name=self.__class__.__name__, log_path=self.__log_path__, # console_log=self.__console_log__, # 屏幕打印日志开关,默认True console_log_level=self.__console_log_level__, # 屏幕打印日志的级别,默认为INFO critical_log=self.__critical_log__, # critica单独l写文件日志,默认关闭 error_log=self.__error_log__, # error级别单独写文件日志,默认开启 warning_log=self.__warning_log__, # warning级别单独写日志,默认关闭 info_log=self.__info_log__, # info级别单独写日志,默认开启 debug_log=self.__debug_log__, # debug级别日志,默认关闭 ) self.__token__ = util.generate_token() if nickname is None: self.__nickname__ = self.__class__.__name__ else: self.__nickname__ = nickname self.nickname = self.__nickname__ self.name = self.__nickname__ self.__singleton__ = singleton self.__description__ = description self.__heart_beat_interval__ = heart_beat_interval self.__threads__ = dict() # 被监控的线程 self.__data_feeder__ = set() # 本Worker订阅的内容 self.__follower__ = set() # Follower self.__error_msg__ = None # self.__stop_info__ = None # self.__stop_time__ = None # self.__status__ = "init" self.redis_key = "dHydra.Worker." + \ self.__class__.__name__ + "." + self.__nickname__ + "." self.channel_pub = self.redis_key + "Pub" """ self.__threads__ = { "nickname": { "description" : "该线程功能备注说明", "name" : "该线程的名字", "target" : "该线程的target" "restart_mode" : "重启模式,可以为 manual/auto/remove; manual则代表允许管理员发送命令手工重启线程, auto则一旦线程关闭立即自动开启, remove则代表一旦线程结束就从监控列表移除", "restart_func" : "自动/手动重启时调用的方法", }, } """ self.shutdown_signals = [ "SIGQUIT", # quit 信号 "SIGINT", # 键盘信号 "SIGHUP", # nohup 命令 "SIGTERM", # kill 命令 ] for s in self.shutdown_signals: # 捕获退出信号后的要调用的,唯一的 shutdown 接口 try: if hasattr(signal, s): signal.signal( getattr(signal, s, None), self.__on_termination__ ) except Exception as e: self.logger.info("绑定退出信号:{}失败,可能与windows系统有关。".format(s)) # 清空它,在run以后重新实例化 # 否则windows下会无法pickle del(self.logger)
def init_logger(): return util.get_logger(logger_name="console")
def __init__( self, singleton=True, # 单例模式 nickname=None, # Worker的自定义名字 description="No Description", # 备注说明 log_level="INFO", # "DEBUG","INFO","WARNING" heart_beat_interval=3, # 默认3秒心跳 **kwargs): self.__token__ = util.generate_token() if nickname is None: self.__nickname__ = self.__class__.__name__ + "Default" else: self.__nickname__ = nickname self.nickname = self.__nickname__ self.name = self.__nickname__ self.__singleton__ = singleton self.__description__ = description self.__heart_beat_interval__ = heart_beat_interval self.__threads__ = dict() # 被监控的线程 self.__data_feeder__ = set() # 本Worker订阅的内容 self.__follower__ = set() # Follower self.__error_msg__ = None # self.__stop_info__ = None # self.__stop_time__ = None # self.__status__ = "init" # "init", "error_exit", "suspended", "user_stopped", "normal" self.redis_key = "dHydra.Worker." + \ self.__class__.__name__ + "." + self.__nickname__ + "." self.channel_pub = self.redis_key + "Pub" """ self.__threads__ = { "nickname": { "description" : "该线程功能备注说明", "name" : "该线程的名字", "target" : "该线程的target" "restart_mode" : "重启模式,可以为 manual/auto/remove; manual则代表允许管理员发送命令手工重启线程, auto则一旦线程关闭立即自动开启, remove则代表一旦线程结束就从监控列表移除", "restart_func" : "自动/手动重启时调用的方法", }, } """ self.logger = util.get_logger(logger_name=self.__class__.__name__) if self.check_prerequisites() is True: super().__init__() self.daemon = True else: sys.exit(0) self.shutdown_signals = [ signal.SIGQUIT, # quit 信号 signal.SIGINT, # 键盘信号 signal.SIGHUP, # nohup 命令 signal.SIGTERM, # kill 命令 ] for s in self.shutdown_signals: # 捕获退出信号后的要调用的,唯一的 shutdown 接口 try: signal.signal(s, self.__on_termination__) except Exception as e: self.logger.info("绑定退出信号:{}失败,可能与windows系统有关。".format(s))
def __init__( self, singleton=True, # 单例模式 nickname=None, # Worker的自定义名字 description="No Description", # 备注说明 heart_beat_interval=1, # 默认1秒心跳 log_path="log", # console_log=True, # 屏幕打印日志开关,默认True console_log_level=logging.INFO, # 屏幕打印日志的级别,默认为INFO critical_log=False, # critical单独写文件日志,默认关闭 error_log=True, # error级别单独写文件日志,默认开启 warning_log=False, # warning级别单独写日志,默认关闭 info_log=True, # info级别单独写日志,默认开启 debug_log=False, # debug级别日志,默认关闭 **kwargs): # 记录日志配置 self.__log_path__ = log_path self.__console_log__ = console_log self.__console_log_level__ = console_log_level self.__critical_log__ = critical_log self.__error_log__ = error_log self.__warning_log__ = warning_log self.__info_log__ = info_log self.__debug_log__ = debug_log self.logger = util.get_logger( logger_name=self.__class__.__name__, log_path=self.__log_path__, # console_log=self.__console_log__, # 屏幕打印日志开关,默认True console_log_level=self.__console_log_level__, # 屏幕打印日志的级别,默认为INFO critical_log=self.__critical_log__, # critica单独l写文件日志,默认关闭 error_log=self.__error_log__, # error级别单独写文件日志,默认开启 warning_log=self.__warning_log__, # warning级别单独写日志,默认关闭 info_log=self.__info_log__, # info级别单独写日志,默认开启 debug_log=self.__debug_log__, # debug级别日志,默认关闭 ) self.__token__ = util.generate_token() if nickname is None: self.__nickname__ = self.__class__.__name__ + "Default" else: self.__nickname__ = nickname self.nickname = self.__nickname__ self.name = self.__nickname__ self.__singleton__ = singleton self.__description__ = description self.__heart_beat_interval__ = heart_beat_interval self.__threads__ = dict() # 被监控的线程 self.__data_feeder__ = set() # 本Worker订阅的内容 self.__follower__ = set() # Follower self.__error_msg__ = None # self.__stop_info__ = None # self.__stop_time__ = None # self.__status__ = "init" self.mongo = False # "init", "error_exit", "suspended", "user_stopped", "normal" self.redis_key = "dHydra.Worker." + \ self.__class__.__name__ + "." + self.__nickname__ + "." self.channel_pub = self.redis_key + "Pub" """ self.__threads__ = { "nickname": { "description" : "该线程功能备注说明", "name" : "该线程的名字", "target" : "该线程的target" "restart_mode" : "重启模式,可以为 manual/auto/remove; manual则代表允许管理员发送命令手工重启线程, auto则一旦线程关闭立即自动开启, remove则代表一旦线程结束就从监控列表移除", "restart_func" : "自动/手动重启时调用的方法", }, } """ if self.check_prerequisites() is True: super().__init__() else: sys.exit(0) self.shutdown_signals = [ "SIGQUIT", # quit 信号 "SIGINT", # 键盘信号 "SIGHUP", # nohup 命令 "SIGTERM", # kill 命令 ] for s in self.shutdown_signals: # 捕获退出信号后的要调用的,唯一的 shutdown 接口 try: if hasattr(signal, s): signal.signal(getattr(signal, s, None), self.__on_termination__) except Exception as e: self.logger.info("绑定退出信号:{}失败,可能与windows系统有关。".format(s)) # 清空它,在run以后重新实例化 # 否则windows下会无法pickle self.logger = None