我正在构建一个运行神经网络的 GUI 应用程序。启动它们效果很好,但我需要能够在网络已经运行和工作的情况下中止计算。
我构建了一个小型原型,它向您展示了我的应用程序中问题的主要机制。
窗口类别:
包含所有 GUI 元素,是启动和控制一切的主要对象。它包含 aQThreadPool
self.__pool
和QRunnable
Object self.__runner
。该QRunnable
对象包含神经网络所需的一切。我使用 QRunnable 对象的原因是,在另一个线程中处理神经网络时不阻塞 GUI。我还需要在神经网络和我的应用程序之间进行通信。
运行程序类:
运行程序类处理主窗口和神经网络本身之间的通信。神经网络是一个Process
来自多处理的对象,放入self.__net
. 为了进行通信,我使用Queue
self.__queue
. 当 QRunnable 对象启动时,进程以 开始self.__net.start()
。我用无限循环观察队列。循环在某些信号上终止。在此示例中,我仅使用 Signal NetSignal.finished
。当网络完成后,我向 Window 对象发送一个信号。
RunnerSignal类:
由于QRunnables无法使用信号,因此需要该类将一些信号封装到QRuannaable对象中。
Mnist 类:
Mnist 类是子进程本身,继承自Process
. 在这个例子中,它运行了一个非常简单的例子,在神经网络中处理 mnist 数据集。进程周围没有循环,通常可用于停止此类子进程。当神经网络完成时,队列向 QRunnable 对象发送一个信号,以通知进程已完成计算,从而向主窗口发送一个信号。
我需要能够以某种方式停止这个过程。我想尝试用 来杀死它os.kill
,但这在我的应用程序中效果不佳。我也尝试过self.__net.terminate()
,self.__net.kill()
. 我正在考虑以某种方式将一个对象传递到神经网络的回调参数中,以便中止那里的处理,但我不太确定这是否是正确的方法。
白衣非少年
相关分类