Python模块psutil:系统进程管理与Selenium效率提升的完美结合

news2024/11/28 22:38:08

在这里插入图片描述

前言

在前面编写一个Selenium的自动化程序时候,发现一个问题。

因笔记本配置较为差,所以每次初始化SeleniumWebDriver都会非常慢,整个等待过程是不友好的。

所以我就想到:

  • 在程序中初始化一个全局的WebDriver对象,在程序结束之后不退出Selenium打开的浏览器。

    这样就只需要启动一次Selenium打开的浏览器,后面都使用这个浏览器。

这样的确是个好主意,但随之而来的问题是:

  • ?万一Selenium打开的浏览器被系统回收或者出现异常了,那么程序运行就会出错!

所以在最终,整个问题解决的思路如下:

  1. 程序运行前先检测指定的 Selenium浏览器(系统进程)是否存在;
  2. 如果存在则往后运行程序;
  3. 如果不存在则先打开Selenium浏览器,再往后运行程序。

文章的标题虽然为 Python psutil:系统进程管理与Selenium效率提升的完美结合,但是应用场景却是很广的,譬如系统监控、系统监控、性能分析、限制系统资源、管理进程。

本文主要借助于 Pythonpsutil模块来实现,所以下面更多的是介绍 psutil模块的使用。

当然,重要的并不是使用什么工具,而是怎么使用工具,以及工具能帮助我们解决哪些问题。

知识点

模块解释
psutil用于在 Python 中检索有关运行进程和系统利用率(CPU、内存、磁盘、网络、传感器)的信息。

具体的介绍看下图:

psutil(python system and process utilities)是一个跨平台库,用于访问操作系统的进程和系统利用率(CPU、内存、磁盘、网络等)。它主要用于系统监控,分析和限制系统资源,以及管理运行的进程。它实现了Unix命令行工具提供的许多功能,如ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop、uptime、pidof、tty、taskset、pmap等。

在这里插入图片描述




应用场景

在使用selenium进行自动化测试时,每次开启和销毁浏览器窗口都会消耗系统资源。使用psutil来监控selenium的浏览器窗口。如果检测到窗口已经存在,就可以复用这个窗口,而不是每次都创建新的窗口。这样可以节省消耗系统资源。

psutil还可以用于多种场景,包括系统监控、性能分析、限制系统资源、管理进程等。

psutil的基础使用

这部分操作,在官方文档中都可以找到。

获取CPU 信息

import psutil

# 获取CPU的数量
cpu_count = psutil.cpu_count()
print(f'Number of CPUs: {cpu_count}')

# 获取CPU的使用率
cpu_percent = psutil.cpu_percent()
print(f'CPU usage: {cpu_percent}%')

# 获取CPU的详细信息
cpu_times = psutil.cpu_times()
print(f'CPU times: {cpu_times}')

获取 内存 信息

# 获取系统的内存使用情况
mem_info = psutil.virtual_memory()
print(f'Memory info: {mem_info}')

# 获取系统的交换内存(swap)使用情况
swap_info = psutil.swap_memory()
print(f'Swap info: {swap_info}')

获取 磁盘 信息

# 获取磁盘分区信息
disk_partitions = psutil.disk_partitions()
print(f'Disk partitions: {disk_partitions}')

# 获取根目录的磁盘使用情况
disk_usage = psutil.disk_usage('/')
print(f'Disk usage: {disk_usage}')

# 获取磁盘IO信息
disk_io = psutil.disk_io_counters()
print(f'Disk IO: {disk_io}')

获取 网络 信息

# 获取网络IO信息
net_io = psutil.net_io_counters()
print(f'Network IO: {net_io}')

# 获取当前的网络连接信息
net_connections = psutil.net_connections()
print(f'Network connections: {net_connections}')

# 获取网络接口信息
net_if_addrs = psutil.net_if_addrs()
print(f'Network interface addresses: {net_if_addrs}')

# 获取网络接口状态
net_if_stats = psutil.net_if_stats()
print(f'Network interface stats: {net_if_stats}')

获取 进程 信息

# 获取当前运行的所有进程ID
pids = psutil.pids()
print(f'Process IDs: {pids}')

# 获取所有进程实例
for proc in psutil.process_iter(['pid', 'name', 'username']):
    print(proc.info)

# 获取指定PID的进程实例
pid = 1
if psutil.pid_exists(pid):
    proc = psutil.Process(pid)
    print(f'Process info: {proc.info()}')

监控系统进程代码

指定chrome版

这里用到我之前的一篇Selenium文章,【Selenium】控制当前已经打开的 chrome浏览器窗口

文章中提到,在命令行使用以下命令去驱动Selenium浏览器

chrome.exe --remote-debugging-port=9527 --user-data-dir=“F:\selenium”

因为使用了命令行去执行,所以在代码中需要检索:是否包含指定命令函参数


在我的Selenium项目中,检测该Selenium浏览器受否存在的代码如下所示:

  • 看不懂就看注释啪🥧~

在这里插入图片描述

代码释义:

这份代码的主要用途是检查是否有包含特定命令行参数的Chrome浏览器进程正在运行。它遍历所有正在运行的进程,如果进程的名称包含"chrome",并且命令行参数中包含--remote-debugging-port=port,那么就返回True,否则返回False。这对于自动化测试非常有用,可以避免重复创建和销毁浏览器窗口,从而节省系统资源。

通用版

下面函数可以用于监控特定的进程是否在运行。例如,你可能有一个重要的服务或应用,你希望确保它始终在运行。你可以定期运行这个函数来检查这个服务或应用是否在运行,如果不在运行,可以采取相应的操作,如重新启动服务或应用。

import os
import subprocess

import psutil


def check_if_specific_process_running(process_name, cmdline=None) -> bool:
    """
    检查是否有包含指定名称的进程正在运行。
    
    Args:
        process_name(str): 要检查的进程名
        cmdline(str): 要检查的命令行参数。默认为None。

    Returns:
        bool: 如果找到匹配的进程则返回True,否则返回False。
    """
    # 遍历所有正在运行的进程
    for proc in psutil.process_iter():
        try:
            # 检查进程名是否包含给定的名称字符串
            if process_name.lower() in proc.name().lower():
                # 获取进程详细信息列表
                p_info = proc.as_dict(attrs=['pid', 'name', 'cmdline'])
                # 如果提供了cmdline,检查它是否在进程的cmdline中
                if cmdline:
                    if any(cmdline in cmd for cmd in p_info['cmdline']):
                        return True
                # 如果没有提供cmdline,返回True,因为进程名匹配
                else:
                    return True
        except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
            pass
    return False


def exec_cmd_command():
    """
    切换到指定路径,若有。然后打开浏览器

    Returns:
        True
    """
    os.chdir(path=config.CHROME_PATH)
    subprocess.Popen(
        r'chrome.exe --remote-debugging-port=9527 --user-data-dir="F:\selenium"',
        shell=True,
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE
    )
    return True


if __name__ == '__main__':
    if not check_if_specific_chrome_running():
        # 打开浏览器
        exec_cmd_command()

总结

psutil是一个强大的库,可以用于获取系统和进程的信息,以及管理进程。它在系统监控、性能分析、资源管理等方面都有广泛的应用。本文中代码是一个很好的例子,展示了如何使用psutil来检查特定的浏览器进程是否正在运行,从而避免重复创建和销毁窗口,节省系统资源。

后话

本次分享到此结束,

see you🎉🎉

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

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

相关文章

Git Rebase 优化项目历史

在软件开发过程中,版本控制是必不可少的一环。Git作为当前最流行的版本控制系统,为开发者提供了强大的工具来管理和维护代码历史。git rebase是其中一个高级特性,它可以用来重新整理提交历史,使之更加清晰和线性。本文将详细介绍g…

1060 爱丁顿数

一.问题: 英国天文学家爱丁顿很喜欢骑车。据说他为了炫耀自己的骑车功力,还定义了一个“爱丁顿数” E ,即满足有 E 天骑车超过 E 英里的最大整数 E。据说爱丁顿自己的 E 等于87。 现给定某人 N 天的骑车距离,请你算出对应的爱丁…

【计算机网络笔记】传输层——TCP特点与段结构

系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 计算机网络性能(2)…

Springboot JSP项目如何以war、jar方式运行

文章目录 一,序二,样例代码1,代码结构2,完整代码备份 三,准备工作1. pom.xml 引入组件2. application.yml 指定jsp配置 四,war方式运行1. 修改pom.xml文件2. mvn执行打包 五,jar方式运行1. 修改…

深入了解汽车级功率MOSFET NVMFS2D3P04M8LT1G P沟道数据表

汽车级功率MOSFET是一种专门用于汽车电子领域的功率MOSFET。它具有高电压、高电流、高温、高可靠性等特点,能够满足汽车电子领域对功率器件的严格要求。汽车级功率MOSFET广泛应用于汽车电机驱动、泵电机控制、车身控制等方面,能够提高汽车电子系统的效率…

sqlserver字符串拼接

本文主要介绍了sqlserver字符串拼接的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值。 1. 概 在SQL语句中经常需要进行字符串拼接,以sqlserver,oracle,mysql三种数据库为例&#…

Flink源码解析四之任务调度和负载均衡

源码概览 jobmanager scheduler:这部分与 Flink 的任务调度有关。 CoLocationConstraint:这是一个约束类,用于确保某些算子的不同子任务在同一个 TaskManager 上运行。这通常用于状态共享或算子链的情况。CoLocationGroup & CoLocationGroupImpl:这些与 CoLocationCon…

10月发布的5篇人工智能论文推荐

JudgeLM: Fine-tuned Large Language Models are Scalable Judges https://arxiv.org/pdf/2310.17631.pdf 由于现有基准和指标的限制,在开放式环境中评估大型语言模型(llm)是一项具有挑战性的任务。为了克服这一挑战,本文引入了微调llm作为可扩展“法官…

解决Couldn‘t find meta-data for provider with authority

今天在复用之前写的安装APK的相关代码时发生了报错&#xff0c;那是因为安卓高版本需要新增FileProvider 新增file_paths <?xml version"1.0" encoding"utf-8"?> <paths xmlns:android"http://schemas.android.com/apk/res/android"…

一文读懂以太坊坎昆升级后 Danksharding 扩容路线

以太坊 EIP-4844 是坎昆升级的核心内容&#xff0c;它引入了一种全新的交易类型&#xff08;blob 携带交易&#xff09;以减少以太坊交易费用。blob 携带交易与常规以太坊交易一样&#xff0c;但有一些额外数据被称为 blob。与当前 calldata 存储交易数据不可变和内存只读相比而…

wordpress如何存储远程附件到fss

管理员登录wordpress ,插件---安装插件--搜索"Hacklog Remote Attachment",进行安装并启用 . 设置中找到 Hacklog远程附件.点击进入选项设置. 按照下图填写fss相关参数.这些信息可以在fss详情中查看.目录路径如果没有请先在fss中创建. 4.设置完毕保存,接下来就…

佳易王桌球室台球厅计时计费电脑收费管理系统软件试用版V18.0下载

佳易王桌球室台球厅计时计费电脑收费管理系统软件试用版V18.0下载 一、佳易王桌球棋牌计时计费软件部分功能简介&#xff1a; 1、计时计费功能 &#xff1a;开台时间和所用的时长直观显示&#xff0c;每3秒即可刷新一次时间。 2、销售商品功能 &#xff1a;商品可以绑定桌子…

天天都能买买买,但双11不凑热闹我浑身难受

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 姝琦、卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦Midjourney 产品统筹 / bobo 场地支持 / 声湃轩北京录音间 有人说满足情绪需求是消费主义的一个重要特征&#xff0c;甚至堪称商家的消费升级歪招。 是吗&…

SpringSecurity+JWT+Redis实现前后端分离认证与授权

spring security的简单原理&#xff1a; SpringSecurity有很多很多的拦截器&#xff0c;在执行流程里面主要有两个核心的拦截器 登陆验证拦截器AuthenticationProcessingFilter 资源管理拦截器AbstractSecurityInterceptor 但拦截器里面的实现需要一些组件来实现&#xff0c;…

Windows系统搭建网盘神器filebrowser结合内网穿透实现公网访问

Windows系统搭建网盘神器filebrowser结合内网穿透实现公网访问 文章目录 Windows系统搭建网盘神器filebrowser结合内网穿透实现公网访问前言1.下载安装File Browser2.启动访问File Browser3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3…

基于安卓Android的校园快药APP-药店app

项目介绍 本文介绍了校园快药APP软件开发建设的意义和国内外发展现状&#xff0c;然后详细描述了所开发手机APP的可行性分析&#xff0c;并分析了手机APP所要实现的功能。因为校园快药设施较多&#xff0c;而且人口密集&#xff0c;不能更好的管理校园快药&#xff0c;造成需要…

[C++ ]:5.类和对象中(运算符重载补充)+ 类和对象下(初始化列表)

类和对象中&#xff08;运算符重载补充&#xff09; 类和对象下&#xff08;初始化列表&#xff09; 一.运算符重载补充&#xff1a;1.流插入运算符&#xff1a;1.考虑到隐含的参数指针&#xff1a;2.进行优化&#xff01;2-1&#xff1a;解决办法&#xff1a;友元2-2&#xff…

Redis 分片集群

目录 ​编辑一、搭建分片集群 1、集群结构 ​编辑 2、准备实例和配置 3、启动 4、创建集群 二、散列插槽 三、集群伸缩 四、故障转移 1、自动故障转移 2、手动故障转移 五、RedisTemplate 访问分片集群 一、搭建分片集群 1、集群结构 主从和哨兵可以解决高可用、高…

01-SDV全域OS研发思考

背景 近年来&#xff0c;随着汽车“新四化”浪潮的兴起&#xff0c;软件定义已成为产业共识&#xff0c;将深度参与到整个汽车的定义、开发验证销售以及服务全过程。一方面确保软件可升级&#xff0c;跨车型、软件甚至跨车企软件重用。另一方面对于硬来讲&#xff0c;要做到可…

PlantSimulation安装帮助文档端口被占用的解决办法

PlantSimulation安装帮助文档端口被占用的解决办法 从PlantSimulaiton&#xff08;TPS&#xff09;2201开始帮助文档开始使用在线&#xff0c;如果使用本地则需要安装本地文档服务器。但是在安装过程中你可能会遇到&#xff0c;5000断开被占用的情况。解决办法如下&#xff1a…