Requisito previo: PyQt5 y subprocesamiento múltiple
El subprocesamiento múltiple se refiere a la ejecución simultánea de varios subprocesos cambiando rápidamente el control de la CPU entre subprocesos (llamado cambio de contexto). El bloqueo de intérprete global de Python limita la ejecución de un subproceso a la vez, incluso si la máquina contiene varios procesadores.
En este artículo, aprenderemos cómo usar subprocesos en Pyqt5. Al crear una GUI, será necesario realizar múltiples trabajos/operaciones en el backend. Supongamos que queremos realizar 4 operaciones simultáneamente. El problema aquí es que cada operación se ejecuta una por una. Durante la ejecución de una operación, la ventana de la GUI tampoco se moverá y es por eso que necesitamos subprocesos. Ambas implementaciones se dan a continuación, lo que obviamente ayudará a comprender mejor sus diferencias.
Acercarse
- Se requieren bibliotecas de importación
- Crear una ventana simple
- Agregar botón con comando
- Ejecutar Pyqt5
sin roscar
Trabajar sin hilos, hace que el proceso se retrase. Además, la ventana no se moverá hasta que se lleve a cabo la ejecución completa.
Python3
# Import Module import sys from PyQt5.QtWidgets import * import time class ListBox(QWidget): def __init__(self): super().__init__() self.Button() def Button(self): # Add Push Button clear_btn = QPushButton('Click Me', self) clear_btn.clicked.connect(self.Operation) # Set geometry self.setGeometry(200, 200, 200, 200) # Display QlistWidget self.show() def Operation(self): print("time start") time.sleep(10) print("time stop") if __name__ == '__main__': app = QApplication(sys.argv) # Call ListBox Class ex = ListBox() # Close the window sys.exit(app.exec_())
Producción:
Con Roscado
Cada vez que hagamos clic en el botón «Click Me» , llamará al método thread() . Dentro del método thread, estamos creando un Objeto Thread donde definimos el nombre de nuestra función.
Python3
# Import Module import sys from PyQt5.QtWidgets import * import time from threading import * class ListBox(QWidget): def __init__(self): super().__init__() self.Button() def Button(self): # Add Push Button clear_btn = QPushButton('Click Me', self) clear_btn.clicked.connect(self.thread) # Set geometry self.setGeometry(200, 200, 200, 200) # Display QlistWidget self.show() def thread(self): t1=Thread(target=self.Operation) t1.start() def Operation(self): print("time start") time.sleep(10) print("time stop") if __name__ == '__main__': app = QApplication(sys.argv) # Call ListBox Class ex = ListBox() # Close the window sys.exit(app.exec_())
Producción: