|
|
|
@ -1,5 +1,4 @@
|
|
|
|
|
|
|
|
|
|
### 多线程与异步编程
|
|
|
|
|
|
|
|
|
|
对于 **I/O 密集型任务**,**异步编程** 通常比 **多线程** 是更好的选择。异步编程特别适合高并发的 I/O 密集型任务(如 Web 服务器、爬虫、实时通信), 特别是大量并发连接的任务。
|
|
|
|
|
|
|
|
|
@ -9,13 +8,14 @@
|
|
|
|
|
|
|
|
|
|
在 GUI(图形用户界面)应用程序中,主线程负责处理用户交互,而其他任务(如文件读写、网络请求)需要在后台运行,以避免阻塞主线程导致界面卡顿。多线程可以与 GUI 主线程共享内存,方便更新界面状态。线程间通信简单,适合处理后台任务。GUI 框架(如 PyQt、Tkinter)通常有自己的事件循环,与异步编程的事件循环冲突。
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
|
|
|
|
|
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__()
|
|
|
|
@ -89,7 +89,7 @@ if __name__ == "__main__":
|
|
|
|
|
window.show()
|
|
|
|
|
sys.exit(app.exec_())
|
|
|
|
|
|
|
|
|
|
</python code>
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
以下场景更适合使用 **多线程**:
|