对线程的一些理解:
一个程序为一个进程(process),一个进程下可以有多个线程(threading),至少有一个线程。
线程是最小的运行单位,多个线程共享一个进程的所有资源,每个线程执行不同的任务。
看到一个形象的解释是,进程是一个房子,里面的人是线程。如果有多个人的话,许多人共享房子里的资源。有时某些资源在一段时间里只能一个人使用(比如厕所),某些资源在一段时间里只能由固定数量的人使用(比如厨房在一段时间里最多容纳3个人)。这里又涉及到‘锁’的概念,这篇文章暂时没有涉及到。
从代码里来解释,python使用 线程 主要是使用threading模块,这段代码里也涉及到了logger模块的初步使用。
我在这里也会详细记录logging模块的使用方法
import logging import threading import time def get_logger(): logger = logging.getLogger("threading_eg") logger.setLevel(logging.WARNING) fh = logging.FileHandler("C:\UsersAdministratorDesktoppython笔记\threading.log") fmt = '%(asctime)s - %(name)s - %(processName)s - %(threadName)s - %(levelname)s - %(message)s' formatter = logging.Formatter(fmt) fh.setFormatter(formatter) logger.addHandler(fh) return logger def doubler(number, logger): logger.debug("xxxx") logger.info("aaaa") logger.warning("bbbb") logger.error("cccc") result = number * 2 time.sleep(5) logger.debug('yyyy: {}'.format( result)) logger = get_logger() thread_names = ['Mike', 'George', 'Wanda', 'Dingbat', 'Nina'] for i in range(5): my_thread = threading.Thread( target=doubler, name=thread_names[i], args=(i, logger)) my_thread.start()
1.先看第一个函数,get_logger
这个函数主要是构造一个logger对象,并设置logger的的各种信息,然后返回该对象。
第一行代码用getLogger方法构造一个logger对象,参数为该logger对象的名字。
第二行设置logger的 ‘日志等级’,我对其的理解是:日志需要输出什么等级的信息。
比如,我设置的等级是WARNING,那么最后输出的信息只会包含warning信息和error信息。
如果设置的等级是DEBUG,那么所有信息都会显示。
日志等级主要有 DEBUG,INFO,WARNING,ERROR,CRITICAL 这几个。
第三行构造了一个handler对象,其内涵是将日志信息输入到什么地方去。handler对象有很多,这里是FileHandler,即是将日志信息输入到文件中去。最后一般都还要和addHandler方法配合使用,将handler加到logger对象去。
logging.FileHandler(filename, mode='a', encoding=None, delay=False),mode为写入模式。
其他handler可以参考这篇博客:
http://blog.csdn.net/yypsober/article/details/51800120
第4~6行主要是设置handler对象的格式,fmt字符串,主要是这是输出哪些信息,第5行构造一个formatter对象,第六行设置handler的格式。
fmt具有固定的格式,包含logging模块的其他的信息也可以在这篇文章里寻找:
https://www.cnblogs.com/qianyuliang/p/7234217.html
对这里fmt的内容稍微解释下:
第一个即是运行时间,第二个是logger的名字,后面是进程名与线程名等等
2.再看第二个函数 doubler
这个函数主要是接受一个数字和一个logger对象,将数字翻倍,然后在logger中输入一些信息。
第1~4行是往logger的message里输入一些信息方法,与logger的日志等级对应。
比如,这里已经输入了四种信息,debug,info,warning,error。这些信息会输入到fmt中的message中。
logger的日志等级就决定了输出哪些等级的信息。
后三行将数字翻倍,然后强制等待5s,最后再debug输入翻倍的信息。
3.看程序最后一段
第一行构造前面设置好格式的logger对象,第二行是线程的名字。
后一部分构造循环,用threading库的Thread方法构造线程:
target为目标,即线程要做的内容。
name为线程名字
args为目标函数的参数,必须为元组对象,从左到右一一对应目标函数的参数。