PyQT 多进程

news2024/12/23 9:32:02

在PyQt中,图形化界面(GUI)是运行在主线程中的,而多进程是在独立的进程中执行的。默认情况下,多进程之间是无法直接共享图形化界面的。

然而,有几种方法可以在多进程中与PyQt的图形化界面进行通信:

  1. 使用进程间通信(Inter-Process Communication,IPC)机制,如管道(Pipe)、共享内存(Shared Memory)或消息队列(Message Queue)。你可以在主线程中创建一个IPC对象,然后将其传递给子进程,子进程可以使用该对象与主线程进行通信。这样,你可以将任务的进度或结果发送回主线程,然后更新图形化界面。

  2. 使用信号与槽机制(Signals and Slots)进行跨线程通信。PyQt提供了线程间通信的机制,你可以在子进程中创建一个线程,然后将该线程与主线程中的槽函数连接起来。子进程可以通过发射信号的方式将任务的进度或结果传递给主线程,然后由主线程的槽函数更新图形化界面。

无论使用哪种方法,都需要小心处理线程或进程间的同步和互斥,以避免出现竞争条件或其他并发问题。

需要注意的是,多进程会引入额外的开销和复杂性,因此在决定使用多进程之前,建议先考虑是否有其他的优化方案,例如使用多线程、异步编程或者优化算法等。

进程间通信

import sys
from PyQt5.QtCore import QProcess, pyqtSignal, pyqtSlot
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget
import time
# 子进程类
class WorkerProcess(QProcess): # 继承自QProcess,用于表示子进程
    resultReady = pyqtSignal(str)

    def __init__(self, parent=None):
        super().__init__(parent)
        self.readyReadStandardOutput.connect(self.handle_output)

    def handle_output(self):
        data = self.readAllStandardOutput().data().decode()
        self.resultReady.emit(data)

# 主窗口类
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        self.setWindowTitle('IPC Example')
        self.button = QPushButton('Start', self)
        self.button.clicked.connect(self.start_worker)
        layout = QVBoxLayout()
        layout.addWidget(self.button)
        widget = QWidget(self)
        widget.setLayout(layout)
        self.setCentralWidget(widget)

    def start_worker(self):
        self.button.setEnabled(False)
        self.worker_process = WorkerProcess()
        self.worker_process.finished.connect(self.worker_finished)
        self.worker_process.resultReady.connect(self.handle_result)
        self.worker_process.start('python', ['worker.py'])

    @pyqtSlot(str)
    def handle_result(self, result):
        print(f'Result: {result}')
        # 在这里处理子进程的结果

    def worker_finished(self):
        self.button.setEnabled(True)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

将在终端的的显示结果显示在PyQt上

import sys
from PyQt5.QtCore import QProcess, pyqtSignal, pyqtSlot
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QTextEdit

# 子进程类
class WorkerProcess(QProcess):
    resultReady = pyqtSignal(str)

    def __init__(self, parent=None):
        super().__init__(parent)
        self.readyReadStandardOutput.connect(self.handle_output)

    def handle_output(self):
        data = self.readAllStandardOutput().data().decode()
        self.resultReady.emit(data)

# 主窗口类
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        self.setWindowTitle('IPC Example')
        self.button = QPushButton('Start', self)
        self.button.clicked.connect(self.start_worker)
        self.text_edit = QTextEdit(self)
        layout = QVBoxLayout()
        layout.addWidget(self.button)
        layout.addWidget(self.text_edit)
        widget = QWidget(self)
        widget.setLayout(layout)
        self.setCentralWidget(widget)

    def start_worker(self):
        self.button.setEnabled(False) # 首先禁用按钮
        self.worker_process = WorkerProcess() # 创建一个WorkerProcess对象作为子进程。
        self.worker_process.finished.connect(self.worker_finished) # 子进程的finished信号连接到worker_finished槽函数
        self.worker_process.resultReady.connect(self.handle_result) # 将子进程的resultReady信号连接到handle_result槽函数
        self.worker_process.start('python', ['worker.py']) # 使用start方法启动子进程,执行worker.py脚本

    @pyqtSlot(str)
    def handle_result(self, result): # 槽函数 接收到子进程的输出结果
        self.text_edit.append(result)  # 将结果添加到文本编辑框中

    def worker_finished(self): # 当子进程完成时,将执行worker_finished函数
        self.button.setEnabled(True)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

进程与进程之间通信

在多进程编程中,进程与进程之间可以使用多种方式进行通信,消息队列只是其中一种方式。以下是一些常用的进程间通信(IPC)机制:

  1. 消息队列(Message Queues):进程可以通过消息队列发送和接收消息。消息队列提供了一种异步的通信方式,进程之间可以通过队列传递数据。

  2. 共享内存(Shared Memory):进程可以通过共享内存区域在它们之间共享数据。多个进程可以访问同一块内存,从而实现数据共享。

  3. 管道(Pipes):管道是一种单向的通信方式,用于在两个进程之间传递数据。一个进程充当管道的写入端,另一个进程充当管道的读取端。

  4. 套接字(Sockets):套接字是一种网络编程中常用的通信方式,但它也可以用于进程间通信。进程可以通过套接字在网络上或本地主机上进行通信。

  5. 文件(Files):进程可以通过读写文件的方式进行通信。一个进程可以将数据写入文件,另一个进程可以读取该文件来获取数据。

这些是一些常见的进程间通信方式,每种方式都有其适用的场景和特点。选择适当的通信方式取决于具体的应用需求和设计考虑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1350966.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Wnmp本地部署结合内网穿透实现任意浏览器远程访问本地服务

最近,我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念,而且内容风趣幽默。我觉得它对大家可能会有所帮助,所以我在此分享。点击这里跳转到网站。 文章目录 前言1.Wnmp下载安装2.Wnmp设置3.安装cpolar内网穿透3.1…

Linux驱动开发学习笔记7《并发与竞争》

目录 一、并发与竞争 1、并发与竞争简介 2、保护内容是什么 二、原子操作 1、 原子操作简介 2、原子整形操作API 函数 3、原子位操作API 函数 4、实验 (1) 修改设备树文件 (2) LED 驱动修改 (3)…

2023年度总结———豫见及遇见

目录 一.AI 人工智能方向 二.华为数通网络方向 三.腾讯云AI绘画方向 四.年度心得总结板块 博主C站主页:知孤云出岫_网络,计算机,计算机网络教案-CSDN博客 博主腾讯云主页: 知孤云出岫 - 个人中心 - 腾讯云开发者社区-腾讯云 2023年年度词&#xff1a…

集合高级知识点

集合高级 1. HashSet 底层原理 HashSet 的特点: HashSet 实现了 Set 接口HashSet 底层实质上是 HashMap可以存放 null 值,但是只能有一个 nullHashSet 不保证元素是有序的,取决于 hash 后,再确定索引的结果,即不保证…

Python 从入门到精通之通俗易懂学闭包

系列 Python从入门到精通之安装与快速入门-CSDN博客 Python从入门到精通之基本数据类型和变量-CSDN博客 Python从入门到精通之集合(List列表、Tuple元组、Dict字典、Set)-CSDN博客 Python从入门到精通之条件语句、循环语句和函数-CSDN博客 Python从…

单片机原理及应用:计数按键控制数码管显示

承接上文&#xff0c;我们来介绍一下按键和数码管的配合工作&#xff0c;由于数码管显示的字符和位数多种多样&#xff0c;无法做到一个字符对应一个按键&#xff0c;所以程序主要记录按键的使用次数来切换数码管的显示。 #include <reg52.h> //包含reg52.h头…

如何使用SeaFile搭建本地私有云盘并结合cpolar实现远程访问

文章目录 1. 前言2. SeaFile云盘设置2.1 SeaFile的安装环境设置2.2 SeaFile下载安装2.3 SeaFile的配置 3. cpolar内网穿透3.1 Cpolar下载安装3.2 Cpolar的注册3.3 Cpolar云端设置3.4 Cpolar本地设置 4.公网访问测试5.结语 1. 前言 现在我们身边的只能设备越来越多&#xff0c;…

2024洗地机哪家强?口碑洗地机推荐

现如今&#xff0c;智能家电在人们生活中变得越来越受欢迎&#xff0c;例如智能洗地机的出现&#xff0c;不仅省时省力&#xff0c;还实现了家务清洁的自由。在家庭中&#xff0c;地面清洁一直是一个令人头疼的问题&#xff0c;各种智能家居品牌通过开发各种智能家电产品来解决…

【工具】vscode搜索结果及工程目录的文件夹、文件的排除

&#x1f41a;作者简介&#xff1a;花神庙码农&#xff08;专注于Linux、WLAN、TCP/IP、Python等技术方向&#xff09;&#x1f433;博客主页&#xff1a;花神庙码农 &#xff0c;地址&#xff1a;https://blog.csdn.net/qxhgd&#x1f310;系列专栏&#xff1a;善假于物&#…

【模拟电路】NE555-电子琴应用原理

一、声音和频率 二、振荡周期和占空比 三、NE555电子琴案例 四、NE555内部和方波发生器 一、声音和频率 声音和频率的关系确实是密切相关的。 在声学中&#xff0c;声音的频率被定义为声波的震动次数&#xff0c;通常以赫兹&#xff08;Hz&#xff09;为单位。频率越高&#x…

log4cplus visual c++ 编译及调试小记

简介 最近在调试一款SATA加密设备&#xff0c;发现设备有时加密出来的数据&#xff0c;再解密时与明文对不上&#xff0c;怀疑是通信问题。因此&#xff0c;急需要在测试工具中加入通信日志。由于对第三方日志库都不熟悉&#xff0c;所以随便选了个log4cplus软件集成到现有工具…

leetcode2975. 移除栅栏得到的正方形田地的最大面积

题目 有一个大型的 (m - 1) x (n - 1) 矩形田地&#xff0c;其两个对角分别是 (1, 1) 和 (m, n) &#xff0c;田地内部有一些水平栅栏和垂直栅栏&#xff0c;分别由数组 hFences 和 vFences 给出。 水平栅栏为坐标 (hFences[i], 1) 到 (hFences[i], n)&#xff0c;垂直栅栏为…

STM32L4

STM32L4系列超低功耗微控制器 意法半导体通过构建新型芯片架构实现了同类产品中最佳的超低功耗及性能&#xff0c;这得益于应用设计上的高度灵活性。 STM32L4系列可以根据微处理器运行时不同的应用需求来适时调整电压从而实现功耗的动态平衡。 该系列包含不同的产品线&#…

(15)Linux 进程创建与终止函数forkslab 分派器

前言&#xff1a;本章我们主要讲解进程的创建与终止&#xff0c;最后简单介绍一下 slab 分派器。 一、进程创建&#xff08;Process creation&#xff09; 1、分叉函数 fork 在 中&#xff0c; fork 函数是非常重要的函数&#xff0c;它从已存在进程中创建一个新的进程。 …

OCP NVME SSD规范解读-3.NVMe管理命令-part2

NVMe-AD-8&#xff1a;在某些情况下&#xff08;如Sanitize命令、Format NVM命令或TCG Revert方法后数据被清除&#xff09;&#xff0c;设备应允许读取已清除的LBAs而不产生错误&#xff0c;并在最后一次清除完成后&#xff0c;对未写入LBAs的读取返回所有零值给主机 NVMe-AD…

闭包,垃圾回收机制

1.垃圾回收机制 当函数执行完毕后,函数内部的变量就会被销毁。 代码&#xff1a; function fn() {var a 10;a;return a;}console.log(fn()); 输出的结果: 11 持续调用的结果: 2.变量的私有化 代码: function fn() {var a 10;return function fn1() {return a;}…

git的使用基础教程

最近项目在搞自动化测试&#xff0c;需要将各种测试脚本集成到自动化框架里边&#xff0c;这个就需要用到版本管理系统了,下面简单价绍一下git的使用。 首先从官网下载并安装git工具&#xff0c;下面以wins系统为例子说明 https://git-scm.com/downloads wins安装好后&#xff…

【学习笔记】环论

子环环同态理想单位元&#xff08;乘法单位元&#xff09;环与子环的单位元无必然关系,即子环不一定有单位元&#xff0c;有也不一定和环的单位元相同 比如 Z 6 Z_6 Z6​有单位元1&#xff0c;其子环 ( 2 ) (2) (2)单位元为4;Z有单位元1&#xff0c;其子环2Z没有单位元若R有单位…

基于蝴蝶算法优化的Elman神经网络数据预测 - 附代码

基于蝴蝶算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于蝴蝶算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于蝴蝶优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针…

介绍混沌工程的主要作用是什么?

混沌工程是一种通过有序的混沌实验来提高系统稳健性和可靠性的实践。它不仅有助于发现问题&#xff0c;更能够促使团队建立起一种主动预防和处理问题的文化&#xff0c;从而为复杂系统的管理提供了全新的视角。本文将介绍混沌工程的主要作用&#xff1a; 发现系统脆弱性&#x…