|
|
|
@ -9,13 +9,13 @@
|
|
|
|
|
|
|
|
|
|
在 GUI(图形用户界面)应用程序中,主线程负责处理用户交互,而其他任务(如文件读写、网络请求)需要在后台运行,以避免阻塞主线程导致界面卡顿。多线程可以与 GUI 主线程共享内存,方便更新界面状态。线程间通信简单,适合处理后台任务。GUI 框架(如 PyQt、Tkinter)通常有自己的事件循环,与异步编程的事件循环冲突。
|
|
|
|
|
|
|
|
|
|
<python code>
|
|
|
|
|
|
|
|
|
|
import sys
|
|
|
|
|
import requests
|
|
|
|
|
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QLabel
|
|
|
|
|
from PyQt5.QtCore import QThread, pyqtSignal
|
|
|
|
|
|
|
|
|
|
# 工作线程:负责下载文件
|
|
|
|
|
# 工作线程:负责下载文件
|
|
|
|
|
class DownloadThread(QThread):
|
|
|
|
|
# 自定义信号,用于通知主线程下载进度
|
|
|
|
|
progress_signal = pyqtSignal(str)
|
|
|
|
@ -40,7 +40,7 @@ class DownloadThread(QThread):
|
|
|
|
|
except Exception as e:
|
|
|
|
|
self.progress_signal.emit(f"下载失败: {str(e)}")
|
|
|
|
|
|
|
|
|
|
# 主窗口
|
|
|
|
|
#### 主窗口
|
|
|
|
|
class MainWindow(QWidget):
|
|
|
|
|
def __init__(self):
|
|
|
|
|
super().__init__()
|
|
|
|
@ -83,7 +83,6 @@ class MainWindow(QWidget):
|
|
|
|
|
# 下载完成后启用按钮
|
|
|
|
|
self.download_button.setEnabled(True)
|
|
|
|
|
|
|
|
|
|
# 运行应用程序
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
app = QApplication(sys.argv)
|
|
|
|
|
window = MainWindow()
|
|
|
|
@ -95,8 +94,9 @@ if __name__ == "__main__":
|
|
|
|
|
|
|
|
|
|
以下场景更适合使用 **多线程**:
|
|
|
|
|
-
|
|
|
|
|
1. **与阻塞式 API 交互**。 某些库或 API 是阻塞式的(如某些数据库驱动、硬件接口库),无法直接使用异步编程。在这种情况下,多线程可以避免阻塞主线程。
|
|
|
|
|
<code>
|
|
|
|
|
**与阻塞式 API 交互**。
|
|
|
|
|
某些库或 API 是阻塞式的(如某些数据库驱动、硬件接口库),无法直接使用异步编程。在这种情况下,多线程可以避免阻塞主线程。
|
|
|
|
|
|
|
|
|
|
import threading
|
|
|
|
|
import time
|
|
|
|
|
import sqlite3
|
|
|
|
@ -123,12 +123,12 @@ def main():
|
|
|
|
|
print("主线程结束")
|
|
|
|
|
|
|
|
|
|
main()
|
|
|
|
|
</code>
|
|
|
|
|
|
|
|
|
|
1. **实时数据处理**。 在实时数据处理场景中(如音频处理、视频流处理),需要快速响应并处理数据,同时保持主线程的响应性。
|
|
|
|
|
|
|
|
|
|
2. **任务队列与线程池**。在需要处理大量短期任务的场景中(如 Web 服务器的请求处理),使用线程池可以高效地管理任务。
|
|
|
|
|
**实时数据处理**。 在实时数据处理场景中(如音频处理、视频流处理),需要快速响应并处理数据,同时保持主线程的响应性。
|
|
|
|
|
|
|
|
|
|
**任务队列与线程池**。在需要处理大量短期任务的场景中(如 Web 服务器的请求处理),使用线程池可以高效地管理任务。
|
|
|
|
|
|
|
|
|
|
3. **与 C/C++ 扩展交互**。 某些 Python 库是基于 C/C++ 扩展实现的(如 `numpy`、`pandas`),这些扩展可能释放了 GIL,允许在多线程中并行运行。
|
|
|
|
|
**与 C/C++ 扩展交互**。 某些 Python 库是基于 C/C++ 扩展实现的(如 `numpy`、`pandas`),这些扩展可能释放了 GIL,允许在多线程中并行运行。
|
|
|
|
|
|
|
|
|
|
4. **需要共享状态的场景**。 在某些场景中,多个任务需要频繁共享和修改状态(如缓存、计数器),使用多线程可以方便地共享内存。
|
|
|
|
|
**需要共享状态的场景**。 在某些场景中,多个任务需要频繁共享和修改状态(如缓存、计数器),使用多线程可以方便地共享内存。
|
|
|
|
|