面试题答案
一键面试常见问题
- 日志内容错乱:多个线程同时写入日志文件,可能导致日志内容交叉混乱,难以准确追踪每个线程的执行情况。
- 文件I/O竞争:多个线程竞争写入日志文件,频繁的文件打开、写入和关闭操作可能导致性能瓶颈,降低系统整体性能。
解决方法
- 使用线程锁:
通过线程锁确保同一时间只有一个线程可以写入日志,避免日志内容错乱。import threading import logging lock = threading.Lock() logging.basicConfig(filename='example.log', level=logging.INFO) def thread_function(): with lock: logging.info('This is a log message from a thread')
- 使用队列和日志记录线程:
主线程将日志记录任务放入队列,由专门的日志记录线程从队列中取出任务并写入文件,减少文件I/O竞争,提高性能。import threading import logging from logging.handlers import QueueHandler, QueueListener from queue import Queue log_queue = Queue() formatter = logging.Formatter('%(asctime)s - %(message)s') file_handler = logging.FileHandler('example.log') file_handler.setFormatter(formatter) queue_handler = QueueHandler(log_queue) root = logging.getLogger() root.addHandler(queue_handler) queue_listener = QueueListener(log_queue, file_handler) queue_listener.start() def thread_function(): logging.info('This is a log message from a thread')