python多线程练习题
多线程练习题目,涉及知识点较多,属于很好的练习题。
题目要求
通过多线程实现类似linux中的>>
功能,也就是将日志记录到指定的文件中。
题目分析
基本为main.py
写主要处理逻辑,utils.py
构造工具类及对应的方法。main.py
定义Server()类,类中定义方法输出内容。
实例化工具类,启动线程,设置标准输出和错误输出至日志文件。
实例化Server()类并调用方法进行内容的持续输出。utils.py
定义工具类,工具类需要传入参数:日志名称。
首先判断日志是否存在,若不存在则创建,然后写入日志;存在则追加写入日志。
实现
main.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import sys from queue1.log_out.utils import TraceLog class Server(object): def log(self): print("start server") for i in range(100): print(i) print("end server") #print的实现是调用sys.stdout.write()方法 if __name__ == "__main__": traceLog = TraceLog("main.log") traceLog.start() sys.stdout = traceLog sys.stderr = traceLog server = Server() server.log() #print将会调用traceLog.write()方法 |
utils.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | import codecs from threading import Thread, Lock import os class TraceLog(Thread): def __init__(self, logName): super(TraceLog, self).__init__() #调用父类的初始化方法 self.logName = logName self.lock = Lock() self.contexts = [] self.isFile() def isFile(self): if not os.path.exists(self.logName): with codecs.open(self.logName, 'w') as f: f.write("this log name is :{0}\n".format(self.logName)) f.write("start log\n") def write(self, context): self.contexts.append(context) #将需要输出的内容追加至列表中 def run(self): while 1: self.lock.acquire() if len(self.contexts) != 0: with codecs.open(self.logName, 'a') as f: #追加方式写入文件 for context in self.contexts: f.write(context) del self.contexts[:] #每次写入完成后清空列表 self.lock.release() |
输出结果
当前目录下会生成main.log
文件,文件内容如下
1 2 3 4 5 6 7 8 9 10 11 | this log name is :main.log start log start server 0 1 2 . . 98 99 end server |
涉及文件读写、锁、多线程、sys模块、os模块等内容。