多线程练习题目,涉及知识点较多,属于很好的练习题。
题目要求
通过多线程实现类似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
18import 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
30import 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
11this log name is :main.log
start log
start server
0
1
2
.
.
98
99
end server
涉及文件读写、锁、多线程、sys模块、os模块等内容。