MST
星途 面试题库

面试题:Python类封装特性在复杂项目架构中的优化应用

在一个大型Python项目中,有多个模块使用到了一个名为`DataProcessor`的类。这个类有多个属性和方法,其中一些属性和方法只应该在类内部使用,以保证数据处理逻辑的一致性和安全性。现在项目面临性能优化需求,需要在不破坏封装特性的前提下,对`DataProcessor`类进行优化,使其在多线程环境下高效运行。请阐述你的优化思路,并给出关键代码示例。
29.4万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

优化思路

  1. 线程安全的数据结构:使用线程安全的数据结构来存储类的属性,例如queue.Queue用于存储需要处理的数据,避免多线程同时访问和修改数据导致的数据不一致问题。
  2. 锁机制:对于不能使用线程安全数据结构的属性,使用threading.Lock来保护对这些属性的访问。确保在同一时间只有一个线程能够访问和修改这些属性。
  3. 多线程处理逻辑:将DataProcessor类中的计算密集型方法改为多线程执行,利用threading.Thread创建线程,并合理分配任务。
  4. 封装保护:对于只应在类内部使用的属性和方法,依然使用双下划线前缀(__)进行命名,保持封装特性。

关键代码示例

import threading
from queue import Queue


class DataProcessor:
    def __init__(self):
        self.__private_attribute = 0
        self.data_queue = Queue()
        self.lock = threading.Lock()

    def __private_method(self):
        # 类内部使用的方法
        pass

    def add_data(self, data):
        self.data_queue.put(data)

    def process_data(self):
        while not self.data_queue.empty():
            data = self.data_queue.get()
            # 这里进行实际的数据处理
            with self.lock:
                self.__private_attribute += 1
            self.__private_method()


def worker(proc):
    proc.process_data()


if __name__ == "__main__":
    processor = DataProcessor()
    for i in range(10):
        processor.add_data(i)
    threads = []
    for _ in range(3):
        t = threading.Thread(target=worker, args=(processor,))
        threads.append(t)
        t.start()
    for t in threads:
        t.join()