multithreading - 如何使用 ThreadPool 通知主线程进行并行计算(PyQt)
问题描述
我有一个 for 循环来读取大量图像,并且我想使用多线程进行加速。我可以从 Internet 上找到很多关于 QThread 的示例。但是,其中许多示例并不是为加速而设计的。
最后,我找到了一个使用多线程方法加速for循环的例子。代码是:
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
import multiprocessing
from multiprocessing.pool import ThreadPool
from multiprocessing.dummy import Pool as DummyPool
from multiprocessing import Pool as ProcessPool
import time
class MainWindow(QMainWindow):
finished = pyqtSignal()
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setWindowTitle("QDicomLabel Test")
self.resize(500, 500)
widget = QWidget()
self.setCentralWidget(widget)
layout = QHBoxLayout()
widget.setLayout(layout)
btn = QPushButton('run')
layout.addWidget(btn)
label = QLabel('0')
layout.addWidget(label)
self.label = label
btn.clicked.connect(self.run)
self.num = 0
self.finished.connect(self.updateText)
def run(self):
num = 4
p = ThreadPool(num)
start_time = time.time()
ret = p.map(self.readfile, range(200))
p.close()
p.join()
print("thread_pool %d, costTime: %fs ret.size: %d" % (num, (time.time() - start_time), len(ret)))
def readfile(self, name):
time.sleep(0.01)
# self.signal.finished.emit()
def updateText(self):
self.num = self.num + 1
self.label.setText(str(self.num))
# QCoreApplication.processEvents()
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
在上面的代码中,我需要读取 200 张图片,我假设读取每个文件需要 0.01s。所以,我们需要大约 2s 来读取所有文件。
在运行函数中,变量“num”影响速度。如果num = 4,读取所有文件大约需要0.5s。当然,它加快了我的阅读速度。
然后,我需要在 GUI 中更新进度。在我的想法中,我将在函数“readfile”中发出一个信号,函数“updateText”将接收信号,然后在 GUI 中更新进度。发出的信号已在函数“readfile”中注释(self.signal.finished.emit()),因为它会破坏 GUI。
那么,如何在 GUI 中更新进度呢?
解决方案
试试看:
def readfile(self, name):
#time.sleep(0.01)
QThread.msleep(10)
# self.signal.finished.emit()
self.finished.emit()
推荐阅读
- visual-c++ - 如何标记这个字符串
- python - 删除不是 a 到 z 的所有内容
- python - 在行首添加带有特定字符串的字符 - Python
- angular - 无法在注销后的 url 上重定向 azure AD
- nlog - NLog 截断语法
- javascript - 如何检索 Firebase-Instance-ID-token?
- javascript - 单击添加类以使用 vanilla JavaScript 隐藏其他元素
- javascript - 未捕获的 ReferenceError:未定义 getVote?
- java - 使用预签名 URL 限制 S3 PUT 文件大小
- node.js - Angular 10 + NodeJS + Express - 无法加载图像但在本地工作