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

时间:2018-03-20 12:51:21

标签: python ipc python-multiprocessing

我有一个主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_())

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

1 个答案:

答案 0 :(得分:1)

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