私は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
スレッド、リソースをクリーンアップし、すべてのハンドルを閉じます。