深入了解Python中的进程控制和监控技巧,提高系统稳定性

news2025/6/11 7:57:15


概要

在计算机系统中,进程管理是一个重要的任务,它涉及创建、启动、监控、终止和管理运行中的进程。Python作为一门强大的编程语言,提供了丰富的库和模块,使得进程管理变得相对容易。本文将介绍如何使用Python来实现系统进程管理,包括创建和管理进程、与进程通信以及监控进程的状态。


创建进程

要创建新的进程,Python提供了多种方式。最常用的是使用subprocess模块来启动外部命令或应用程序,以及使用multiprocessing模块来创建并行进程。

使用 subprocess 启动外部命令

subprocess模块允许在Python中启动外部命令或应用程序。

下面是一个简单的示例,演示如何使用subprocess来运行一个外部命令:

import subprocess

# 启动外部命令并等待它完成
result = subprocess.run(["ls", "-l"], stdout=subprocess.PIPE, text=True)

# 打印命令的输出
print(result.stdout)

在上述示例中,使用subprocess.run函数来运行ls -l命令,并通过stdout=subprocess.PIPE参数来捕获命令的输出。然后,打印了命令的输出。

使用 multiprocessing 创建并行进程

multiprocessing模块允许在Python中创建并行进程,以充分利用多核处理器。

下面是一个简单的示例,演示如何使用multiprocessing来创建并行进程:

import multiprocessing

def worker_function():
    print("Worker process")

if __name__ == "__main__":
    # 创建并启动一个进程
    worker_process = multiprocessing.Process(target=worker_function)
    worker_process.start()

    # 等待进程完成
    worker_process.join()

    print("Main process")

在上述示例中,定义了一个名为worker_function的函数,然后在主程序中创建了一个新的进程并启动它。最后,等待进程完成,并打印出主进程的消息。

进程间通信

在多进程应用程序中,进程之间通常需要进行通信以交换数据或协调操作。Python提供了多种方式来实现进程间通信,包括使用multiprocessing模块的队列、管道和共享内存等机制。

使用队列进行进程间通信

队列是一种常见的进程间通信机制,它允许一个进程将数据放入队列,而另一个进程则可以从队列中取出数据。

下面是一个使用multiprocessing模块的队列进行进程间通信的示例:

import multiprocessing

def producer(queue):
    for i in range(5):
        queue.put(i)
        print(f"Produced {i}")

def consumer(queue):
    while True:
        item = queue.get()
        if item is None:
            break
        print(f"Consumed {item}")

if __name__ == "__main__":
    queue = multiprocessing.Queue()

    producer_process = multiprocessing.Process(target=producer, args=(queue,))
    consumer_process = multiprocessing.Process(target=consumer, args=(queue,))

    producer_process.start()
    consumer_process.start()

    producer_process.join()
    queue.put(None)
    consumer_process.join()

在上述示例中,创建了一个multiprocessing.Queue对象,然后分别在生产者和消费者进程中使用这个队列。生产者进程将数据放入队列,而消费者进程从队列中取出数据。通过这种方式,两个进程可以进行数据交换。

使用管道进行进程间通信

管道是一种进程间通信的高级机制,它允许两个进程之间进行双向通信。

下面是一个使用multiprocessing模块的管道进行进程间通信的示例:

import multiprocessing

def sender(pipe):
    pipe.send("Hello from sender")

def receiver(pipe):
    message

 = pipe.recv()
    print(f"Received message: {message}")

if __name__ == "__main__":
    parent_pipe, child_pipe = multiprocessing.Pipe()

    sender_process = multiprocessing.Process(target=sender, args=(parent_pipe,))
    receiver_process = multiprocessing.Process(target=receiver, args=(child_pipe,))

    sender_process.start()
    receiver_process.start()

    sender_process.join()
    receiver_process.join()

在上述示例中,创建了两个管道,一个用于父进程到子进程的通信,另一个用于子进程到父进程的通信。发送进程通过send方法向管道发送消息,而接收进程通过recv方法接收消息。

进程监控和管理

在实际应用中,通常需要监控和管理运行中的进程,以确保它们正常工作。Python提供了多种方式来监控和管理进程,包括获取进程状态、发送信号以及定时检查进程等。

获取进程状态

要获取进程的状态信息,可以使用psutil库,它是一个强大的跨平台进程和系统工具库。

下面是一个示例,演示如何使用psutil获取进程的状态信息:

import psutil

# 获取当前进程的PID
pid = psutil.Process().pid

# 获取进程的状态信息
process = psutil.Process(pid)
print(f"Process name: {process.name()}")
print(f"Status: {process.status()}")
print(f"CPU usage: {process.cpu_percent()}%")
print(f"Memory usage: {process.memory_info().rss / (1024 * 1024)} MB")

在上述示例中,使用psutil库获取了当前进程的PID,并创建了一个psutil.Process对象来获取进程的状态信息,包括进程名称、状态、CPU使用率和内存使用量。

发送信号

Python允许向进程发送信号,以请求其执行特定操作。使用os模块可以发送信号,例如终止进程。

下面是一个示例,演示如何发送信号终止进程:

import os
import time

# 创建一个子进程
pid = os.fork()

if pid == 0:
    # 子进程
    print("Child process started.")
    time.sleep(5)
    print("Child process exiting.")
else:
    # 父进程
    print(f"Parent process started. Child PID: {pid}")
    time.sleep(2)
    print("Sending termination signal to child process.")
    os.kill(pid, 15)
    os.wait()
    print("Parent process exiting.")

在上述示例中,创建了一个子进程,并在父进程中发送信号(信号15,即SIGTERM)以终止子进程。

总结

在Python中,实现系统进程管理是一个重要且广泛应用的任务。本文介绍了如何使用Python来创建进程、进行进程间通信以及监控和管理进程。通过subprocess模块、multiprocessing模块、psutil库以及os模块,可以轻松地实现各种进程管理操作,以满足不同应用场景的需求。希望本文提供的示例代码和解释有助于大家更好地理解和应用Python实现系统进程管理的技术。

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!

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

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

相关文章

MQTT基础下载使用

1.下载MQTT(MQTT官网) 下载完后在bin目录下启动cmd 控制台输入emqx start,注意,此时控制台是没有反应的,就回你个D:\EMQX。其实已经打开了。 打开桌面上的MQTTX 并新建连接 这是测试的数据 我订阅了一个test1的订阅 并且我发布…

chrome面向服务的架构SOA

chrome 浏览器面向服务的架构 原来的各种模块会被重构成独立的服务,每个服务都可以独在独立的进程中运行,可以在浏览器的任务管理器中看到各种服务。 "面向服务的架构"(Service-Oriented Architecture,SOA)…

解决mock单元测试中 无法获取实体类xxx对应的表名

错误描述:在执行单元测试时,执行到new Example时抛出异常,提示无法获取实体类xxx对应的表名 Example example new Example(ServeSubscribeRecord.class);Example.Criteria criteria example.createCriteria();criteria.andEqualTo("se…

一步到位:掌握Python中Lambda表达式的5种实用技巧

一步到位:掌握Python中Lambda表达式的5种实用技巧 引言技巧一:单行函数定义技巧二:与内置函数结合技巧三:在数据结构排序中的应用技巧四:作为回调函数技巧五:与函数式编程结合结语 引言 在Python编程的宇宙…

【unity小技巧】Unity音乐和音效管理器

最终效果 前言 在游戏开发中,音乐和音效的管理是一个重要的环节。好的音乐和合适的音效可以为游戏增添氛围并提升玩家的体验。为了更好地管理音乐和音效,我们可以使用一个专门的音乐和音效管理器。 在本文中,我将向大家介绍如何在Unity中创…

气缸功能块(SMART PLC梯形图代码)

有关气缸功能块的更多介绍,可以参考下面链接文章: https://rxxw-control.blog.csdn.net/article/details/125459568https://rxxw-control.blog.csdn.net/article/details/125459568CODESYS平台双通气缸功能块 https://rxxw-control.blog.csdn.net/article/details/12544822…

听GPT 讲Rust源代码--compiler(6)

File: rust/compiler/rustc_index/src/idx.rs 在Rust的源代码中,idx.rs文件位于rust/compiler/rustc_index/src/目录下,它定义了用于索引访问的Idx trait。以下是该文件的详细介绍: Idx是一个基本的整数索引类型,它用于支持Rust编…

C#/.NET/.NET Core优秀项目和框架2023年12月简报

前言 公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(公众号每周至少推荐两个优秀的项目和框架当然节假日除外),公众号推文有项目和框架的介绍、功能特点以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先…

智能分析网关V4智慧港口码头可视化视频智能监管方案

一、需求背景 近年来,水利港口码头正在进行智能化建设,现场管理已经是重中之重。港口作为货物、集装箱堆放及中转机构,具有昼夜不歇、天气多变、环境恶劣等特性,安全保卫工作显得更加重要。港口码头的巡检现场如何高效、快捷地对…

【MySQL·8.0·源码】MySQL 的查询处理

Query processing MySQL 的 Query 处理可以分为 Parse、Prepare(Resolve/Transform)、Optimize 和 Execute 几个阶段 Parse 词法扫描器将 SQL 语句字符串分解为 tokens,语法分析器将 tokens 组装成语法树的子树结构,并 Reduce 为基本查询结构&#xff0…

Centos 磁盘挂载和磁盘扩容(新加硬盘方式)

步骤总结如下 一、对磁盘进行分区 二、对磁盘进行格式化 三、将磁盘挂载到对应目录 四、做开机自动挂载磁盘 磁盘分区 1.使用命令:fdisk -l 查看磁盘(注:正常在Centos7中第一块数据盘标识一般是/dev/sda,第二块数据盘标识一般是/dev/sdb&…

小程序一次性订阅消息(消息通知):java服务端实现

文章目录 引言一、消息订阅1.1 小程序订阅消息功能介绍1.2 消息分类1.2.1 新版一次性订阅消息Beta1.2.2 一次性订阅消息(用户通过弹窗订阅)1.2.3 长期订阅消息(用户通过弹窗订阅)1.2.4 设备订阅消息 二、获取模板ID1.登录[微信公众…

10款值得推荐的Blazor UI组件库

前言 经常看到有小伙伴在DotNetGuide技术社区交流群里问有什么好用的Blazor UI组件库推荐的,本文将分享一些开源、实用、美观的Blazor UI组件库,提供给广大C#/.NET开发者们学习和使用(注意:排名不分先后,都是十分优秀…

算法与数据结构之数组(Java)

目录 1、数组的定义 2、线性结构与非线性结构 3、数组的表现形式 3.1 一维数组 3.2 多维数组 4、重要特性:随机访问 5、ArrayList和数组 6、堆内存和栈内存 7、数组的增删查改 7.1 插入数据 7.2 删除一个数据 7.3 修改数组 7.4 查找数据 8、总结 什么…

CIFAR图片分类数据集

1. CIFAR介绍 官网链接:CIFAR-10 and CIFAR-100 datasets CIFAR-10是一个更接近普适物体的彩色图像数据集。CIFAR-10 是由Hinton 的学生Alex Krizhevsky 和Ilya Sutskever 整理的一个用于识别普适物体的小型数据集。一共包含10 个类别的RGB 彩色图片:飞机…

机器学习期末复习

机器学习 选择题名词解释:简答题计算题一、线性回归二、决策树三、贝叶斯 选择题 机器学习利用经验 ,须对以下()进行分析 A 天气 B 数据 C 生活 D 语言 归纳偏好值指机器学习算法在学习的过程中,对以下(&a…

【Java基础篇】 try中return A,catch中return Bfinally中return C,最终返回值是什么?

try中return A,catch中return Bfinally中return C,最终返回值是什么? ✔️典型解析✔️拓展知识仓✔️finally 和 return 的关系 ✔️ final、finally、finalize有什么区别✔️final✔️finally✔️ finalize ✔️典型解析 最终的返回值将会是C 因为 fi…

计算机毕业设计-----SSM自习室图书馆座位预约管理系统

项目介绍 一款由jspssmmysql实现的图书馆预约占座管理系统,前端采用的是当下最流行的easyui框架,后台用的ssm(spring、springMVC、mybaits)框架.添加学生和教师时会自动在用户表中注册,定时任务会定时生成座位信息&am…

Cortex-M3 内核的中断优先级

第一步:分组(一次) 第二步:根据每个中断,设置抢占优先级(根据分组可以知道可以几位设置),然后子优先级。 1. 中断编号 ARM 为 Cortex-M3 内核 一共设计了 255 个中断,编号…

【SpringBoot开发】之商城项目案例(订单及订单项生成)

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是君易--鑨,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的博客专栏《SpringBoot开发之商城项目系列》。&#x1f3af…