从Python中其他进程中运行的函数调用类方法

Posted

技术标签:

【中文标题】从Python中其他进程中运行的函数调用类方法【英文标题】:Call class method from function running in other process in Python 【发布时间】:2018-03-20 12:51:20 【问题描述】:

我有一个主 GUI 来接收来自放大器的数据并绘制它。当我单击一个按钮时,会创建一个新进程并使用阻塞方法接收数据(这就是我需要另一个进程的原因)。我的问题是,如何将接收到的数据发送到主 GUI 进行绘制?这是一个方案以及我尝试过的方案:

import multiprocessing as mp

# Load the .ui file
gui_main_class = uic.loadUiType("gui_main.ui")[0]

# Function that receive the data (RUNS IN OTHER PROCESS)
def manager_process(gui_main):
    amp = AmpReceiver()
    while True
        data = amp.getData()
        **HERE IS WHERE I HAVE TO CALL draw_data(data) IN GuiMainClass TO PLOT THE DATA**


# Main class that instantiates the UI
class GuiMainClass(QtWidgets.QMainWindow, gui_main_class):

    def __init__(self, parent=None):
        QtGui.QWindow.__init__(self, parent)
        self.setupUi(self)
        self.pushButton.clicked.connect(self.receive_data_process)

    def receive_data_process(self):
        self.data_receiver_process = mp.Process(target=manager_process)
        self.data_receiver_process.start()

    def draw_data(self, data):
        CODE TO UPDATE THE PLOT (NOT INTERESTING FOR THE QUESTION)


# Main function
if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    application = GuiMainClass()
    sys.exit(app.exec_())

我认为它必须是可能的,但我不知道如何解决这个问题,因为我发现在进程之间传递一个对象实际上复制了该对象,但没有在引用中传递它(所以你不能调用原始方法上的方法)那么,您认为最好的选择是什么?非常感谢!

【问题讨论】:

您可以在 QThread 中运行其他进程并将接收到的数据发送到 QT 的主线程。请记住,只允许主线程访问 QT 的小部件。 Qthread和Process有什么区别?我使用进程是因为我想利用多核处理器,QThread 可以吗? 【参考方案1】:

Python 的multiprocessing 模块提供several techniques for IPC。对于您的情况,最简单的可能是Queue:当manager_process 检索数据时,它会将其放在共享的Queue 实例上。在原始进程中,您运行一个单独的线程,该线程从队列中检索项目并调用draw_data

【讨论】:

我一直在阅读 Queue 类文档,我想我会尝试一下,谢谢!当我找到解决方案时,我会更新问题 队列类和使用 queue.get() 阻塞方法监听的线程解决了我的问题。非常感谢!

以上是关于从Python中其他进程中运行的函数调用类方法的主要内容,如果未能解决你的问题,请参考以下文章

Python调用(运行)外部程序

Python中调用其他程序的方式

从正在运行的进程中调用函数

Python调用(运行)外部程序

Python中四种运行其他程序的方式

Tkinter - 在类中使用Button命令从另一个类调用函数