我有 Kali Linux 操作系统,最近我一直在使用 python 脚本(使用 python 和 QT5 创建 GUI),并且我在代码中使用多处理和多线程。然而我注意到,最近每当我运行脚本时,整个笔记本电脑都会出现响应延迟的情况,即使脚本结束后,笔记本电脑仍然无法恢复正常速度。
我做了什么:
- 该设备是最新的。
代码的简化版本
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import *
from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox, QInputDialog
from PyQt5.QtGui import QIcon, QPixmap
from PyQt5.QtCore import QProcess
#loading the GUI..
from GUI import GUICLASS
class WorkerThread(QThread):
request_signal = QtCore.pyqtSignal()
Start_test= QtCore.pyqtSignal(int)
def __init__(self, parent = None):
super(WorkerThread, self).__init__(parent)
print("init")
@QtCore.pyqtSlot()
def doWork(self):
self.request_signal.emit()
@QtCore.pyqtSlot(int)
def startTheTest(self):
self.Start_test.emit("start the test")
def stop(self):
self.terminate()
print("this thread is terminating")
class theMainCode(QMainWindow, Ui_IoTTestbed, reportClass, FuncsToAddDevices):
def __init__(self):
super().__init__()
self.setupUi(self)
self.initialize_GUI()
def initialize_GUI(self):
####################### Start: Buttons ##############################
#initialize Buttons
self.button1.setEnabled(False)
self.Button2.clicked.connect(self.startAPscript)
def startAPscript(self, TestingDevice):
self.startTheThread()
def startTheThread(self, MAC):
thread2 = QtCore.QThread(self)
thread2.start()
self.worker2 = WorkerThread()
self.worker2.moveToThread(thread2)
self.worker2.Start_test.connect(lambda:self.startTesting(0,MAC))
self.worker2.startTheTest()
@pyqtSlot(int)
def startTesting(self,number =0 , MAC="", second=False):
if not second:
self.tests=list(TestList.keys())
print("loading tests: ", self.tests)
if MAC in self.process and len(self.tests)==0 :
print("if statment")
return self.testsDone(MAC)
print("\n\nThe tests left is:\n ", self.tests)
time.sleep(2)
for _ in range(len(self.tests)):
script_name = self.tests.pop(0)
self.runTest(script_name)
if len(self.tests) ==0: #done empty..
print("Test is done")
self.testsDone(MAC)
def testsDone(self, MAC):
print("kill the threads")
self.worker2.stop()
#self.worker.stop()
#----------------------------------------------------------------------------------------------------------------
def closeEvent(self, *args, **kwargs):
super(QMainWindow, self).closeEvent(*args, **kwargs)
if (self.worker != None):
print("Killed = 1")
self.worker.stop()
if (self.worker2 != None):
print("Killed = 2")
self.worker2.stop()
print("we are done")
app.exec_()
if __name__ == "__main__":
app = QApplication(sys.argv)
main = theMainCode()
main.show()
sys.exit(app.exec_())
如何检查是什么延迟了 GUI 响应?
**编辑
这是我发现的结果ps aux | grep kworker
:请检查所附图片。当我再次打开笔记本电脑时,一些 kworkers 又重新开始工作。
此外,我无法拍摄正确的屏幕截图,因为笔记本电脑的响应不是很好。
答案1
您可以尝试powertop
分别iotop
检查什么消耗了最多的电量以及什么使用了最多的磁盘 IO。与top
这些一起应该是幕后实际发生的事情的一个不错的指标。
答案2
分析您的 python 代码。
配置文件是一组统计数据,描述了程序各个部分执行的频率和时间。这些统计数据可以通过 pstats 模块格式化为报告。
https://docs.python.org/3/library/profile.html
确保清理线程、资源并关闭所有句柄。