第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

使用多處理,從 PyQt5 應(yīng)用程序停止子進(jìn)程,其中子進(jìn)程不使用事件循環(huán)

使用多處理,從 PyQt5 應(yīng)用程序停止子進(jìn)程,其中子進(jìn)程不使用事件循環(huán)

猛跑小豬 2023-08-22 10:24:49
我正在構(gòu)建一個(gè)運(yùn)行神經(jīng)網(wǎng)絡(luò)的 GUI 應(yīng)用程序。啟動(dòng)它們效果很好,但我需要能夠在網(wǎng)絡(luò)已經(jīng)運(yùn)行和工作的情況下中止計(jì)算。我構(gòu)建了一個(gè)小型原型,它向您展示了我的應(yīng)用程序中問題的主要機(jī)制。建筑學(xué)窗口類別:包含所有 GUI 元素,是啟動(dòng)和控制一切的主要對(duì)象。它包含 aQThreadPool self.__pool和QRunnableObject self.__runner。該QRunnable對(duì)象包含神經(jīng)網(wǎng)絡(luò)所需的一切。我使用 QRunnable 對(duì)象的原因是,在另一個(gè)線程中處理神經(jīng)網(wǎng)絡(luò)時(shí)不阻塞 GUI。我還需要在神經(jīng)網(wǎng)絡(luò)和我的應(yīng)用程序之間進(jìn)行通信。運(yùn)行程序類:運(yùn)行程序類處理主窗口和神經(jīng)網(wǎng)絡(luò)本身之間的通信。神經(jīng)網(wǎng)絡(luò)是一個(gè)Process來自多處理的對(duì)象,放入self.__net. 為了進(jìn)行通信,我使用Queue self.__queue. 當(dāng) QRunnable 對(duì)象啟動(dòng)時(shí),進(jìn)程以 開始self.__net.start()。我用無限循環(huán)觀察隊(duì)列。循環(huán)在某些信號(hào)上終止。在此示例中,我僅使用 Signal NetSignal.finished。當(dāng)網(wǎng)絡(luò)完成后,我向 Window 對(duì)象發(fā)送一個(gè)信號(hào)。RunnerSignal類:由于QRunnables無法使用信號(hào),因此需要該類將一些信號(hào)封裝到QRuannaable對(duì)象中。Mnist 類:Mnist 類是子進(jìn)程本身,繼承自Process. 在這個(gè)例子中,它運(yùn)行了一個(gè)非常簡(jiǎn)單的例子,在神經(jīng)網(wǎng)絡(luò)中處理 mnist 數(shù)據(jù)集。進(jìn)程周圍沒有循環(huán),通??捎糜谕V勾祟愖舆M(jìn)程。當(dāng)神經(jīng)網(wǎng)絡(luò)完成時(shí),隊(duì)列向 QRunnable 對(duì)象發(fā)送一個(gè)信號(hào),以通知進(jìn)程已完成計(jì)算,從而向主窗口發(fā)送一個(gè)信號(hào)。問題我需要能夠以某種方式停止這個(gè)過程。我想嘗試用 來殺死它os.kill,但這在我的應(yīng)用程序中效果不佳。我也嘗試過self.__net.terminate(),self.__net.kill(). 我正在考慮以某種方式將一個(gè)對(duì)象傳遞到神經(jīng)網(wǎng)絡(luò)的回調(diào)參數(shù)中,以便中止那里的處理,但我不太確定這是否是正確的方法。
查看完整描述

1 回答

?
白衣非少年

TA貢獻(xiàn)1155條經(jīng)驗(yàn) 獲得超0個(gè)贊

好吧,現(xiàn)在我已經(jīng)知道問題出在哪里了。當(dāng)我終止進(jìn)程時(shí)self.__net.terminate()仍然存在僵尸進(jìn)程,為什么我認(rèn)為這不是正確的解決方案。


僵尸進(jìn)程是由 QRunnable 引起的,它不會(huì)終止,因?yàn)樗诘却舆M(jìn)程在隊(duì)列中發(fā)送信號(hào)。


因此,我需要一個(gè)自定義的“終止”函數(shù),它調(diào)用 Terminate() 并向 QRunnable 發(fā)送一個(gè)信號(hào),表明該過程已完成。這樣,所有進(jìn)程和線程都會(huì)相應(yīng)終止,并且不會(huì)留下任何僵尸進(jìn)程。


import tensorflow as tf

from sys             import exit, argv

from multiprocessing import Process, Queue

from PyQt5.QtWidgets import QPushButton, QApplication, QHBoxLayout, QWidget, QLabel

from PyQt5.QtCore    import QRunnable, QObject, pyqtSignal, QThreadPool



class Window(QWidget):


    def __init__(self):

        QWidget.__init__(self)


        self.__btn_run = QPushButton("Start")

        self.__btn_stp = QPushButton("Stop")

        self.__label   = QLabel("Idle")


        self.__runner  = Runner()

        self.__pool    = QThreadPool.globalInstance()


        self.__btn_run.clicked.connect(self.__run_net)

        self.__btn_stp.clicked.connect(self.__stp_net)

        self.__runner.signals.finished.connect(self.__on_finished)


        self.__btn_stp.setDisabled(True)


        self.setLayout(QHBoxLayout())

        self.layout().addWidget(self.__btn_run)

        self.layout().addWidget(self.__btn_stp)

        self.layout().addWidget(self.__label)


    def __run_net(self):

        self.__btn_run.setDisabled(True)

        self.__btn_stp.setEnabled(True)

        self.__label.setText("Running")

        self.__pool.start(self.__runner)


    def __stp_net(self):

        self.__runner.close()

        # What to do here?


    def __on_finished(self):

        self.__btn_run.setEnabled(True)

        self.__btn_stp.setDisabled(True)

        self.__label.setText("Finished")

        self.__runner = Runner()



class Runner(QRunnable):


    def __init__(self):

        QRunnable.__init__(self)

        self.__queue = Queue()

        self.__net   = Mnist(self.__queue)

        self.signals = RunnerSignal()


    def run(self):

        self.__net.start()

        while True:

            data = self.__queue.get()

            if data == NetSignal.finished:

                self.signals.finished.emit()

                break


    def close(self):

        self.__net.end_process()



class RunnerSignal(QObject):

    finished = pyqtSignal()



class Mnist(Process):

    def __init__(self, queue: Queue):

        Process.__init__(self)

        self.__queue = queue


    def run(self):

        mnist = tf.keras.datasets.mnist  # 28x28 Bilder hangeschriebener Ziffern von 0-9


        (x_train, y_train), (x_test, y_test) = mnist.load_data()


        x_train = tf.keras.utils.normalize(x_train, axis=1)


        model   = tf.keras.models.Sequential()

        model.add(tf.keras.layers.Flatten())

        model.add(tf.keras.layers.Dense(128, activation=tf.nn.relu))

        model.add(tf.keras.layers.Dense(128, activation=tf.nn.relu))

        model.add(tf.keras.layers.Dense(10, activation=tf.nn.softmax))


        model.compile(optimizer="adam",

                      loss="sparse_categorical_crossentropy",

                      metrics=['accuracy'])


        model.fit(x_train, y_train, epochs=8)

        self.__queue.put(NetSignal.finished)

        self.__queue.close()


    def end_process(self):

        self.terminate()

        self.__queue.put(NetSignal.finished)

        self.__queue.close()

        


class NetSignal:

    finished = "finished"



if __name__ == "__main__":

    main_thread = QApplication(argv)

    main_window = Window()

    main_window.show()

    exit(main_thread.exec())



查看完整回答
反對(duì) 回復(fù) 2023-08-22
  • 1 回答
  • 0 關(guān)注
  • 104 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)