У меня есть цикл for для чтения большого количества изображений, и я хочу использовать многопоточность для ускорения.Я могу найти много примеров из Интернета о QThread.Однако многие из этих примеров не предназначены для ускорения.
Наконец, я нашел пример использования многопоточного метода для ускорения цикла.И код:
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,01 с.Итак, нам нужно около 2 секунд, чтобы прочитать все файлы.
В функции запуска переменная 'num' влияет на скорость.Если num = 4, чтение всех файлов займет около 0,5 с.Определенно, это ускорит мое чтение.
Затем мне нужно обновить прогресс в графическом интерфейсе.По-моему, я испущу сигнал в функции «readfile», а функция «updateText» получит сигнал, а затем обновит прогресс в GUI.Излучение сигнала было аннотировано (self.signal.finished.emit ()) в функции «readfile», потому что это разрушит графический интерфейс.
Итак, как обновить прогресс в графическом интерфейсе?