python多线程练习题

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

猜你喜欢

转载自my.oschina.net/u/3803404/blog/1819728