저는 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
. 첨부된 이미지를 확인해주세요. 노트북을 다시 열자 몇몇 K노동자들이 다시 일을 시작했다.
그리고 노트북 반응이 너무 좋지 않아서 제대로 된 스크린샷을 찍을 수가 없었습니다.
답변1
가장 많은 전력을 소비하는 것과 가장 많은 디스크 IO를 사용하는 것을 powertop
별도로 확인할 수 있습니다 . 이와 iotop
함께 top
실제로 뒤에서 무슨 일이 일어나고 있는지에 대한 좋은 지표가 되어야 합니다.
답변2
Python 코드를 분석하십시오.
프로필은 프로그램의 다양한 부분이 실행되는 빈도와 시기를 설명하는 통계 집합입니다. 이러한 통계는 pstats 모듈을 통해 보고서 형식으로 지정할 수 있습니다.
https://docs.python.org/3/library/profile.html
스레드, 리소스를 정리하고 모든 핸들을 닫으십시오.