示例#1
0
文件: SinaL2.py 项目: EGQM/SinaL2
    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()
示例#2
0
    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__)
示例#3
0
 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__,
     )
示例#4
0
    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级别日志,默认关闭
        )
示例#5
0
    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级别日志,默认关闭
        )
示例#6
0
 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__,
     )
示例#7
0
    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)
示例#8
0
def init_logger():
    return util.get_logger(logger_name="console")
示例#9
0
 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))
示例#10
0
    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
示例#11
0
def init_logger():
    return util.get_logger(logger_name="console")