由于使用 python3 和多线程,Kali linux 变得越来越慢

由于使用 python3 和多线程,Kali linux 变得越来越慢

我有 Kali Linux 操作系统,最近我一直在使用 python 脚本(使用 python 和 QT5 创建 GUI),并且我在代码中使用多处理和多线程。然而我注意到,最近每当我运行脚本时,整个笔记本电脑都会出现响应延迟的情况,即使脚本结束后,笔记本电脑仍然无法恢复正常速度。

我做了什么:

  1. 该设备是最新的。

代码的简化版本

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 又重新开始工作。
此外,我无法拍摄正确的屏幕截图,因为笔记本电脑的响应不是很好。

CMD 结果

答案1

您可以尝试powertop分别iotop检查什么消耗了最多的电量以及什么使用了最多的磁盘 IO。与top这些一起应该是幕后实际发生的事情的一个不错的指标。

答案2

分析您的 python 代码。
配置文件是一组统计数据,描述了程序各个部分执行的频率和时间。这些统计数据可以通过 pstats 模块格式化为报告。

https://docs.python.org/3/library/profile.html

确保清理线程、资源并关闭所有句柄。

相关内容