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模块等内容。

Recommended Posts