pyqt5多进程多线程
时间: 2024-12-27 21:27:41 浏览: 5
### PyQt5 中实现多进程与多线程
#### 使用 `QThread` 实现多线程
为了防止应用程序在处理长时间运行的任务时卡住,可以在单独的线程中执行这些任务。这可以通过继承 `QThread` 类来完成,并重写其 `run()` 方法。
```python
from PyQt5.QtCore import QThread, pyqtSignal
class Worker(QThread):
progress = pyqtSignal(int)
def run(self):
for i in range(101): # 假设这是一个耗时操作
self.progress.emit(i)
time.sleep(0.1)
app = QApplication([])
worker = Worker()
worker.start()
window = QWidget()
layout = QVBoxLayout(window)
progress_bar = QProgressBar()
layout.addWidget(progress_bar)
def update_progress(value):
progress_bar.setValue(value)
worker.progress.connect(update_progress)
window.show()
app.exec_()
```
这段代码展示了如何创建一个新的工作线程来进行一些模拟的工作负载[^1]。
#### 使用 Python 的 `multiprocessing` 库实现多进程
对于 CPU 密集型任务,Python 提供了 `multiprocessing` 模块用于启动子进程。需要注意的是,在 PyQT5 程序里集成多进程可能涉及到数据共享等问题,因此建议只把计算密集部分放入进程中去跑,UI 更新仍然放在主线程做。
```python
import multiprocessing as mp
from queue import Empty
class ProcessWorker(mp.Process):
def __init__(self, task_queue, result_queue):
super().__init__()
self.task_queue = task_queue
self.result_queue = result_queue
def run(self):
while True:
try:
func, args = self.task_queue.get_nowait()
res = func(*args)
self.result_queue.put(res)
except Empty:
break
if __name__ == '__main__':
manager = mp.Manager()
tasks = manager.Queue()
results = manager.Queue()
worker = ProcessWorker(tasks, results)
worker.daemon = True
worker.start()
# 向队列添加任务...
tasks.put((some_function, (arg1,arg2)))
app = QApplication([])
window = QMainWindow()
...
app.exec_()
worker.join()
```
此段代码说明了怎样利用 Python 自带的 `multiprocessing` 来分担繁重的数据处理工作[^3]。
阅读全文