最近一段时间在优化一个Redis实例的读写访问量采集程序,对数据统计的方式进行了重新实现,并采用多进程机制利用多核优势对数据进行采集统计。在实现的过程中遇到了一些问题也学到了一些东西在这篇博客中总结出来,以便后续学习参考。欢迎批评指正,共同学习进步!


一、logging模块的使用

    1、默认情况下,logging将日志打印到屏幕,日志级别为WARNING;日志级别大小关系为:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET;只有大于WARNING的日志才会在屏幕上输出

    2、Logging模块组成主要分为四个部分:

        Loggers:提供应用程序直接使用的接口

        Handlers:将Loggers产生的日志传到指定位置

        Filters:对输出日志进行过滤

        Formatters:控制输出格式

    3、在logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有

        filename:用指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中。

        filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定                     为“w”。

        format:指定handler使用的日志显示格式。

        datefmt:指定日期时间格式。

        level:设置rootlogger的日志级别

        stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文            件,  默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。

        format参数中可能用到的格式化串:

            %(name)s Logger的名字

            %(levelno)s 数字形式的日志级别

            %(levelname)s 文本形式的日志级别

            %(filename)s 调用日志输出函数的模块的文件名

            %(module)s 调用日志输出函数的模块名

            %(funcName)s 调用日志输出函数的函数名

            %(lineno)d 调用日志输出函数的语句所在的代码行

            %(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示

            %(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数

            %(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面                的是毫秒

            %(message)s用户输出的消息


二、多线程编程

需要使用模块:threading

    1、启动一个线程的两种方式:

        1)直接调用:首先写一个线程要调用的函数,然后通过:t1 = threading.Thread(target=函数名,args=(参数,)) 来生成一个线程实例,  t1.start() 来启动一个线程

        2)继承式调用:首先先一个线程类(注意,这个类中必须有一个run方法)。然后通过实例化类来启动线程

    2、 常用函数

        1)线程等待子线程执行完毕用join()

        2)把当前线程设置为守护线程用setDaemon(True),当父进程结束时,当前线程也就结束了

    3、全局解释器锁(GIL):

        同一时间只有一个线程获得数据,从而执行,python的多线程其实在同一时间内只有一个线程执行


三、异常处理

    在开发过程中,由于遇到了3中不同的异常而且可能还有未知的没有捕获到的异常,为了对不同的异常进行捕获并进行处理,刚开始是用不同的异常名进行捕获,但是很不幸,有些异常并不是在此处抛出的,导致无法捕获;后来发现使用Exception捕获异常可以将异常内容输出,因此想到使用find()方法进行检查,对不同异常进行区分并处理。参考代码如下:

    实现Redis实例读写访问量采集统计程序知识点总结_第1张图片