python 选择题 多线程_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模块等内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值