Subprocess 和 Multiprocessing 的区别与使用要点及进程关闭方法

Subprocess 和 Multiprocessing 的区别与使用要点及进程关闭方法

最近在使用这两个库比较多,所以就借此机会记录一下这两个库的使用方式

一、Subprocess 和 Multiprocessing 的区别

1. 功能目标不同

  • Subprocess:主要用于在 Python 程序中启动外部程序或命令,并与它们进行交互,管理其输入、输出和错误流。例如,可以调用系统命令行工具来执行特定任务,如文件操作、系统管理等。

  • Multiprocessing:旨在利用多核处理器的优势,通过创建多个独立的 Python 进程来并行执行任务,提高程序的性能和效率。主要用于处理可以并行化的计算密集型任务或需要独立执行的多个任务。

2. 进程管理方式不同

  • Subprocess:管理的是外部进程,对这些进程的控制相对有限。主要关注启动进程、传递参数、捕获输出和处理错误等操作。一旦启动了外部进程,通常只能等待它完成或通过特定的信号进行交互。

  • Multiprocessing:提供了更全面的进程管理功能,可以创建、启动、停止和同步多个 Python 进程。可以在主程序中控制子进程的生命周期,并且可以通过共享数据结构或消息传递机制在进程之间进行通信。

二、Subprocess 的使用知识点

1. 启动外部命令

使用 subprocess.run() 函数可以方便地启动外部命令,并获取其返回码、输出和错误信息。例如:

import subprocessresult = subprocess.run(["ls", "-l"], capture_output=True, text=True)
print(result.stdout)

这里执行了 ls -l 命令,并打印出其输出。

2. 管道和重定向

可以使用 subprocess.Popen() 来创建更复杂的管道和重定向操作。例如:

p1 = subprocess.Popen(["ls"], stdout=subprocess.PIPE)
p2 = subprocess.Popen(["grep", "txt"], stdin=p1.stdout, stdout=subprocess.PIPE)
p1.stdout.close()
output = p2.communicate()[0]
print(output.decode())

这个例子中,首先执行 ls 命令,然后将其输出通过管道传递给 grep 命令进行过滤。

3. 错误处理

当外部命令执行出错时,可以通过检查返回码和错误信息来进行处理。例如:

result = subprocess.run(["invalid_command"], capture_output=True, text=True)
if result.returncode!= 0:print(f"Error: {result.stderr}")

三、Multiprocessing 的使用知识点

1. 创建进程

可以使用 multiprocessing.Process 类来创建一个新的进程。例如:

import multiprocessingdef worker():print("Worker process is running.")if __name__ == '__main__':process = multiprocessing.Process(target=worker)process.start()

这里定义了一个 worker 函数,并在主程序中创建了一个新的进程来执行这个函数。

2. 进程间通信

  • 共享内存:可以使用 multiprocessing.Valuemultiprocessing.Array 来创建共享的内存对象,以便在进程之间共享数据。例如:

import multiprocessingshared_value = multiprocessing.Value('i', 0)def increment():global shared_valuewith shared_value.get_lock():shared_value.value += 1processes = [multiprocessing.Process(target=increment) for _ in range(10)]
for p in processes:p.start()
for p in processes:p.join()print(shared_value.value)
  • 消息传递:可以使用 multiprocessing.Queuemultiprocessing.Pipe 来实现进程间的消息传递。例如:

import multiprocessingdef producer(q):for i in range(10):q.put(i)def consumer(q):while True:item = q.get()if item is None:breakprint(item)if __name__ == '__main__':q = multiprocessing.Queue()p1 = multiprocessing.Process(target=producer, args=(q,))p2 = multiprocessing.Process(target=consumer, args=(q,))p1.start()p2.start()p1.join()q.put(None)p2.join()

3. 进程池

multiprocessing.Pool 可以方便地管理多个进程,自动分配任务并收集结果。例如:

import multiprocessingdef square(x):return x * xif __name__ == '__main__':with multiprocessing.Pool(processes=4) as pool:results = pool.map(square, range(10))print(results)

四、关闭进程的方法

对于 Subprocess 创建的进程

  • 等待进程自然结束:可以使用 subprocess.run()subprocess.Popen().wait() 来等待外部进程自然结束。如果外部进程无限期运行,可以考虑设置超时时间或通过发送特定信号来终止它。

  • 发送信号终止进程:可以使用 subprocess.Popen().terminate()subprocess.Popen().kill() 来发送终止信号给外部进程。terminate() 通常发送一个温和的终止信号(SIGTERM),而 kill() 发送一个强制终止信号(SIGKILL)。

对于 Multiprocessing 创建的进程

  • 使用 Process.terminate():可以在主程序中调用子进程对象的 terminate() 方法来立即终止子进程。例如:

import multiprocessingdef worker():while True:passif __name__ == '__main__':process = multiprocessing.Process(target=worker)process.start()# 某个条件满足时终止子进程process.terminate()process.join()
  • 使用 Pool.terminate():如果使用了进程池,可以调用 Pool.terminate() 来立即终止所有正在运行的子进程。例如:

import multiprocessingdef square(x):return x * xif __name__ == '__main__':with multiprocessing.Pool(processes=4) as pool:# 某个条件满足时终止进程池中的所有进程pool.terminate()

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

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

相关文章

Pytorch-GPU版本离线安装

最近在复现一项深度学习的工作,发现自己的pytorch是装的cpu版的(好像当时是直接加清华源,默认是cpu版本)。从官网在线下载速度太慢,还时不时断开连接,我们可以配置conda的清华源去这个问题,但是考虑到是在用…

.NET周刊【11月第4期 2024-11-24】

国内文章 C# 入门深度学习:万字长文讲解微积分和梯度下降 https://www.cnblogs.com/whuanle/p/18551532 这篇文章主要介绍了使用 C# 进行深度学习的方法,特别是微积分在此领域的应用。作者简要讲解了极限、导数等基本概念,并展示了如何在 …

How to monitor Spring Boot apps with the AppDynamics Java Agent

本文介绍如何使用 AppDynamics Java 代理监视 Azure Spring Apps 中的 Spring Boot 应用程序。 使用 AppDynamics Java 代理可以: 监视应用程序使用环境变量配置 AppDynamics Java 代理 在 AppDynamics 仪表板中检查所有监视数据 How to monitor Spring Boot app…

使用ECharts创建带百分比标注的环形图

在数据可视化领域,环形图是一种非常有效的图表类型,它能够清晰地展示各部分与整体的关系。今天,我们将通过ECharts来创建一个带百分比标注的环形图,并详细解释如何实现这一效果。 1. 数据准备 首先,我们定义了一些基础…

如何确保数据库和Redis数据的一致性

在Spring Boot项目中,保证数据库和Redis数据一致性是一个重要的问题,特别是在涉及缓存和数据库交互的场景中。以下是一些常用的策略和方法,以确保数据库和Redis数据的一致性: 1. 写操作同步 先更新数据库,再更新Redis…

Android opengl 绘制矩形,宽高相同,不能显示为正方形,是怎么回事

在Android上使用OpenGL绘制矩形(或尝试显示为正方形)时,如果结果显示为不是正方形,可能有几个原因。以下是一些常见的因素及解决方法: 视口(Viewport)设置不当: OpenGL的视口定义了…

基于LSTM的文本多分类任务

概述: LSTM(Long Short-Term Memory,长短时记忆)模型是一种特殊的循环神经网络(RNN)架构,由Hochreiter和Schmidhuber于1997年提出。LSTM被设计来解决标准RNN在处理序列数据时遇到的长期依赖问题…

学习记录:js算法(一百零六):最长回文子串

文章目录 最长回文子串思路一 最长回文子串 给你一个字符串 s,找到 s 中最长的回文子串 示例 1: 输入:s "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。示例 2: 输…

JWT介绍和结合springboot项目实践(登录、注销授权认证管理)

目录 一、JWT介绍(一)基本介绍(二)jwt有哪些库1、jjwt(Java JWT)2、nimbus - jwt - jwt - api 和 nimbus - jwt - jwt - impl3、spring - security - jwt(已弃用,但在旧项目中有参考…

frp软件实现网络穿透

1. 名词 1.1. 网络穿透 网络穿透是一种技术,用于解决内网设备或服务无法直接被外部网络访问的问题。通常,内网设备位于路由器后面,并没有公网 IP 地址,因此外部用户不能直接连接到这些设备。网络穿透通过一些特定的技术手段&…

leetcode3250. 单调数组对的数目 I,仅需1s

题目: https://leetcode.cn/problems/find-the-count-of-monotonic-pairs-i/description/ 不为别的,只是记录下这个超过100%,而且比原先最快的快了一个量级 不知道咋分析,反正得出结论就是,变大不变,变小…

使用docker-compose部署搜索引擎ElasticSearch6.8.10

背景 Elasticsearch 是一个开源的分布式搜索和分析引擎,基于 Apache Lucene 构建。它被广泛用于实时数据搜索、日志分析、全文检索等应用场景。 Elasticsearch 支持高效的全文搜索,并提供了强大的聚合功能,可以处理大规模的数据集并进行快速…

Zabbix 模板翻译自动化教程

在企业 IT 运维管理中,Zabbix 作为一款强大的开源监控平台被广泛应用。而 Zabbix 模板作为监控配置的重要组成部分,用来定义监控项、触发器、图形等。随着国际化的需求增加,Zabbix 模板的翻译工作变得日益重要,特别是在需要为不同…

Springboot小知识(1):启动类与配置

一、启动类(引导类) 在通常情况下,你创建的Spring应用项目都会为你自动生成一个启动类,它是这个应用的起点。 在Spring Boot中,引导类(也称为启动类,通常是main方法所在的类)是整个…

JavaScript 高级教程:异步编程、面向对象与性能优化

在前两篇教程中,我们学习了 JavaScript 的基础和进阶内容。这篇文章将带领你进入更深层次,学习 JavaScript 的异步编程模型、面向对象编程(OOP),以及性能优化的技巧。这些内容对于构建复杂、流畅的前端应用至关重要。 …

uniapp手机端一些坑记录

关于 z-paging-x 组件,在ios上有时候通过弹窗去粗发它reload时会触发闪退,可能是弹框插入进去导致的DOM 元素已经被移除或者不可用,解决办法是加上他自带属性 :showRefresherWhenReload"true" 加上showRefresherWhe…

数据集-目标检测系列- 海边漫步锻炼人检测数据集 person >> DataBall

数据集-目标检测系列- 海边漫步锻炼人检测数据集 person >> DataBall DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加中。 需要更多数据资源和技术解决方案,知识星球: “DataBall - X 数据球…

NLP信息抽取大总结:三大任务(带Prompt模板)

信息抽取大总结 1.NLP的信息抽取的本质?2.信息抽取三大任务?3.开放域VS限定域4.信息抽取三大范式?范式一:基于自定义规则抽取(2018年前)范式二:基于Bert下游任务建模抽取(2018年后&a…

手机中的核心SOC是什么?

大家好,我是山羊君Goat。 常常听说CPU,中央处理器等等的,它是一个电脑或单片机系统的核心,但是对于SOC可能相比于CPU了解的人没有那么广泛。 所以SOC是什么? SOC全称是System on Chip,就是片上系统&#…

网络--socket编程--基础

1、网络字节序 已知:内存中的很多数据都有大小端之分,在网络这,网络数据流也是有大小端之分的。 TCP/IP协议规定:网络数据流采用大端字节序(即低地址处放高位字节)。 因此,小端机器发送网络数据流之前,必须转为大端(一般的机器会自动转换): 在网络-本地字节序转换…