从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中其他进程中运行的函数调用类方法的主要内容,如果未能解决你的问题,请参考以下文章