面试题答案
一键面试使用线程锁(Mutex)确保数据一致性
- 线程锁的作用:线程锁(
QMutex
在 PyQt 中)用于防止多个线程同时访问共享资源,避免资源竞争。当一个线程获取了锁,其他线程必须等待锁被释放才能访问共享资源。 - 关键代码片段:
import sys
import threading
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtCore import QMutex
class DataManager:
def __init__(self):
self.mutex = QMutex()
self.shared_data = None
def update_data(self, new_data):
self.mutex.lock()
try:
self.shared_data = new_data
finally:
self.mutex.unlock()
def get_data(self):
self.mutex.lock()
try:
return self.shared_data
finally:
self.mutex.unlock()
使用信号机制更新界面
- 信号机制的作用:PyQt 的信号与槽机制允许在不同线程间安全地通信,特别是用于更新图形界面。因为图形界面的更新必须在主线程进行,通过信号,工作线程可以将数据传递给主线程,主线程的槽函数负责更新界面。
- 关键代码片段:
import sys
import threading
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel
from PyQt5.QtCore import pyqtSignal, QObject
import time
class DataFetcher(QObject):
data_updated = pyqtSignal(object)
def __init__(self, data_manager):
super().__init__()
self.data_manager = data_manager
self.thread = threading.Thread(target=self.fetch_data)
self.thread.start()
def fetch_data(self):
while True:
new_data = "new data from network" # 模拟从网络获取数据
self.data_manager.update_data(new_data)
self.data_updated.emit(self.data_manager.get_data())
time.sleep(1)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.data_manager = DataManager()
self.data_fetcher = DataFetcher(self.data_manager)
self.label = QLabel(self)
self.setCentralWidget(self.label)
self.data_fetcher.data_updated.connect(self.update_ui)
def update_ui(self, data):
self.label.setText(f"Data: {data}")
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
在上述代码中,DataManager
类使用 QMutex
来保护共享数据 shared_data
。DataFetcher
类在新线程中模拟从网络获取数据,更新共享数据并通过信号 data_updated
发送数据。MainWindow
类接收信号并在主线程更新界面,从而确保数据一致性和界面更新的流畅性。