Python multiprocessing多进程编程,进程间通信,psutil监控进程状态并通过电子邮件告警

2023-05-16

python多进程编程、进程监测

    • 一、 mutiprocessng多进程编程和通信
    • 二、进程监测
      • 分析
    • 三、Python邮件发送功能
    • 四、完整代码
      • 运行结果:

服务器上的web后端经常需要同时运行多个进程,各个进程之间需要交换数据,这个功能在Python中可以借助multiprocessing实现。更进一步,进程中断以后我们想要开发人员第一时间收到消息以进行改进和维护,这就需要借助进程管理包psutil和python自带的电子邮件发送模块smtplib和email实现。

一、 mutiprocessng多进程编程和通信

为了模拟多进程通信,我们设计了三个模块来实现这个功能,分别是接收(receiver),解析(parser),和发布(publish),数据通过mutiprocessing的队列Queue由接收模块传给解析,再由解析模块传给发布。

Receiver这里通过一个while循环不断产生自然数,把他放到队列:

def receiver(self, queue):                                                                            
    while True:                                                                                     
        self.count += 1                                                                             
        if not queue.full():                                                                        
            print(multiprocessing.current_process().pid, "进程放数据", self.count)                  
            queue.put(self.count)                                                                   
            time.sleep(1)                                                                           
        else:                                                                                       
            time.sleep(2) 

parser对数据进行进一步加工,他需要两个队列参数,一个负责从receiver接收,一个负责给publisher传递。当receiver传递过来的数据等于20时,故意让程序报错,模拟进程报错down掉。

def parser(self, queue, queue2):                                                                    
    while True:                                                                                     
        if not queue.empty():                                                                       
            num = queue.get()                                                                       
            if num == 20:       # 这里当num到20时,故意让程序报错,模拟这个进程报错down掉                                                                    
                a = int("hello world")                                                              
                self.info = "Now count is %d" % a                                                   
                queue2.put(self.info)                                                               
            else:                                                                                   
                print(multiprocessing.current_process().pid, "进程接收数据", num)                   
                # lock.acquire()                                                                    
                self.info = "Now count is {}".format(num)                                           
                # lock.release()                                                                    
                queue2.put(self.info)                                                               
        else:                                                                                       
            pass

publisher负责发布数据

def publish(self, queue):                                                                           
                                                                                                    
    while True:                                                                                     
        if not queue.empty():                                                                       
            msg = queue.get()                                                                       
            # lock.acquire()                                                                        
            print("进程", multiprocessing.current_process().pid, "Publish info:", msg)              
            # lock.release()                                                                        
        else:                                                                                       
            pass

参考mutiliprocessing官方文档https://docs.python.org/zh-cn/3/library/multiprocessing.html#connection-objects

二、进程监测

分析

对于这种情况,我们可以使用如下的方案去实现:
方案一:使用 Zabbix/Prometheus监控系统,对Java应用程序做 TCP 端口检测。如果检测端口不通,就设置检测失败的触发器。然后实现告警.
方案二: 使用 Zabbix的自定义Key去实现告警,自定义key 的内容是执行一个shell脚本,Shell脚本用来检测进程是否存在,不存在的话,输出为 0,存在输出为1。然后Zabbix 的触发器 设置最近的T值 不为1,从而来实现进程状态检测的告警。
方案三:编写Python脚本用来检测进程的状态,然后使用Python的内置库,实现邮件告警。

这里我们选择方案三,要实现的功能:检测一个进程是否变变成了僵尸进程
思路:
1.首先Python程序需要检测给定进程是否正常运行。
2.检测到进程如果正常,不做任何处理;如果已经变成了僵尸进程,就需要触发邮件告警的函数
3.Python程序需要定时定期地去执行检测脚本。(可选,我这里没实现,可以通过shell脚本定期执行一遍python文件来实现,或者python自己sleep,然后设置成linux后台的守护进程)

# 进程检测函数,不能单独运行
def checkprocess(self, target_pid):
    self.target_pid = target_pid
    pid1, pid2, pid3 = self.target_pid
    while True:
        print('Monitoring')
        process1 = psutil.Process(pid1)  # 根据pid实例化三个进程
        process2 = psutil.Process(pid2)
        process3 = psutil.Process(pid3)
        if process1.is_running and process1.status() != psutil.STATUS_ZOMBIE:
        # 这里加and是因为psutil的官方文档说,is_running会把僵尸进程的结果也返回True。至于进程具体有几种状态,可以参考psutil官方文档。
            pass
        else:
            self.sendmail(self.receiver, "进程监测", "receiver进程变成了僵尸进程!,请检测原因")
        if process2.is_running and process2.status() != psutil.STATUS_ZOMBIE:
            pass
        else:
            self.sendmail(self.receiver, "进程监测", "parser进程变成了僵尸进程!请检测原因")
        if process3.is_running and process3.status() != psutil.STATUS_ZOMBIE:
            pass
        else:
            self.sendmail(self.receiver, "进程监测", "receiver进程变成了僵尸进程!请检测原因")
        time.sleep(5)

关于进程的各种状态,参考psutil官方文档:https://psutil.readthedocs.io/en/latest/index.html?highlight=status#process-status-constants
在这里插入图片描述

三、Python邮件发送功能

使用python实现电子邮件发送,并使用类封装成一个模块,需要用到python自带的email和smtplib库

  • smtplib负责创建SMTP的操作对象并连接smtp目标服务器,调用对象中的方法,发送邮件到目标地址
  • email库用来创建邮件对象(常见的有纯文本邮件对象、作为附件的图片对象,多种对象混合的邮件对象)
  • 用python代理登录qq邮箱发邮件,是需要更改自己qq邮箱设置的。在这里大家需要做两件事情:邮箱开启SMTP功能 、获得授权码,参考:https://zhuanlan.zhihu.com/p/25565454
from email.mime.text import MIMEText
from email.header import Header
import smtplib

class SendEmail(object):

    def __init__(self):
        self.host_server = 'smtp.qq.com'
        # 发件人的qq号码
        self.sender_qq = 'xxxxx'               
        # qq邮箱的授权码,需要收到开启QQ邮箱的smtp服务,在首页,设置中
        self.pwd = 'xxx'               
        self.sender_qq_mail = 'xxx@qq.com'       # 发件人邮箱
        # 创建SMTP的操作对象并连接smtp目标服务器,可以是163、QQ等
        self.smtp = smtplib.SMTP_SSL(self.host_server)
        
        # set_debuglevel()是用来调试的。参数值为1表示开启调试模式,参数值为0关闭调试模式
        # self.smtp.set_debuglevel(1)
        self.smtp.ehlo(self.host_server)
        self.smtp.login(self.sender_qq, self.pwd)         # 登录验证

    def sendmail(self, receivers, mail_title, mail_content):
        msg = MIMEText(mail_content, "plain", 'utf-8') # 构造一个文本邮件对象
        # 下面设置邮件头
        # 邮件主题
        msg["Subject"] = Header(mail_title, 'utf-8')
        # 发件人
        msg["From"] = self.sender_qq_mail
        # 收件人
        msg["To"] = ",".join(receivers)
        try:
        # msg.as_string()中as_string()是将msg(MIMEText或MIMEMultipart对象)变为str。
            self.smtp.sendmail(self.sender_qq_mail, msg['To'].split(','), msg.as_string())
            print("mail has been post successfully")
        except smtplib.SMTPException as e:
            print(repr(e))

if __name__ == "__main__":
    sm = SendEmail()
    sm.sendmail(['xxx@163.com', 'xxx@gmail.com'], "python测试","你好,现在在进行一项用python登录qq邮箱发邮件的测试")

四、完整代码

下面是封装成类以后的完整代码:
receiver.py

#  创建一个模拟接收器,循环产生数据,并存入缓存                                                                                                                                                                                                  
import time                                                                                             
import multiprocessing                                                                                  
                                                                                                        
class Recver:                                                                                           
                                                                                                        
    def __init__(self):                                                                                 
        self.count = 0                                                                                  
                                                                                                        
    def recver(self, queue):                                                                            
        while True:                                                                                     
            self.count += 1                                                                             
            if not queue.full():                                                                        
                print(multiprocessing.current_process().pid, "进程放数据", self.count)                  
                queue.put(self.count)                                                                   
                time.sleep(1)                                                                           
            else:                                                                                       
                time.sleep(2) 

parser.py

# 接收循环产生的数据,并解析,然后再存入缓存                                                                                                                                                                                                     
import multiprocessing                                                                                  
                                                                                                                                                                                                          
class Parser:                                                                                           
    def __init__(self):                                                                                 
        self.info = "null"                                                                              
                                                                                                        
    def parser(self, queue, queue2):                                                                    
        while True:                                                                                     
            if not queue.empty():                                                                       
                num = queue.get()                                                                       
                if num == 20:                                                                           
                    a = int("hello world")                                                              
                    self.info = "Now count is %d" % a                                                   
                    queue2.put(self.info)                                                               
                else:                                                                                   
                    print(multiprocessing.current_process().pid, "进程接收数据", num)                   
                    # lock.acquire()                                                                    
                    self.info = "Now count is {}".format(num)                                           
                    # lock.release()                                                                    
                    queue2.put(self.info)                                                               
            else:                                                                                       
                pas

publisher.py

# 从缓存中读取并发布                                                                                                                                                                                                                             
import multiprocessing                                                                                  
                                                                                                        
class Publisher():                                                                                      
    def __init__(self):                                                                                 
        pass                                                                                            
                                                                                                        
    def publish(self, queue):                                                                           
                                                                                                        
        while True:                                                                                     
            if not queue.empty():                                                                       
                msg = queue.get()                                                                       
                # lock.acquire()                                                                        
                print("进程", multiprocessing.current_process().pid, "Publish info:", msg)              
                # lock.release()                                                                        
            else:                                                                                       
                pass

监测脚本monitor.py

from email.mime.text import MIMEText
from email.header import Header
import smtplib
import psutil
import time


class Monitor(object):
    def __init__(self):
        self.target_pid = []           # 要监测的目标pid
        self.host_server = 'smtp.qq.com'               # 使用QQ邮箱的smtp服务
        self.sender_qq = 'xxx'                  # 自己的QQ号
        self.pwd = 'xxxxx'                  # QQ邮箱的SMTP授权码
        self.sender_qq_mail = 'xxx@qq.com'      # 发件人邮箱,测试我也用的自己的QQ邮箱
        self.receiver = ['xxx'] # 收件人邮箱,可以有多个,写在列表里用逗号隔开
        self.smtp = smtplib.SMTP_SSL(self.host_server)  # 创建SMTP的操作对象并连接smtp目标服务器,可以是163、QQ等
        # set_debuglevel()是用来调试的。参数值为1表示开启调试模式,参数值为0关闭调试模式
        # self.smtp.set_debuglevel(1)
        self.smtp.ehlo(self.host_server)
        self.smtp.login(self.sender_qq, self.pwd)        # 登录验证

    def sendmail(self, receivers, mail_title, mail_content):
        # 构造一个MIMEText对象,就表示一个文本邮件对象
        msg = MIMEText(mail_content, "plain", 'utf-8')
        # 下面设置邮件头
        # 邮件主题
        msg["Subject"] = Header(mail_title, 'utf-8')
        # 发件人
        msg["From"] = self.sender_qq_mail
        # 收件人
        msg["To"] = ",".join(receivers)
        try:
            # msg.as_string()中as_string()是将msg(MIMEText或MIMEMultipart对象)变为str。
            self.smtp.sendmail(self.sender_qq_mail, msg['To'].split(','), msg.as_string())
            self.smtp.quit()
            print("mail has been post successfully")
        except smtplib.SMTPException as e:
            print(repr(e))


    def checkprocess(self, target_pid):
        self.target_pid = target_pid
        pid1, pid2, pid3 = self.target_pid
        while True:
            print('Monitoring')
            process1 = psutil.Process(pid1)  # 根据pid实例化三个进程
            process2 = psutil.Process(pid2)
            process3 = psutil.Process(pid3)
            if process1.is_running and process1.status() != psutil.STATUS_ZOMBIE:
                # print('process1 status:', process1.status)
                pass
            else:
                self.sendmail(self.receiver, "进程监测", "receiver进程变成了僵尸进程!,请检测原因")
            if process2.is_running and process2.status() != psutil.STATUS_ZOMBIE:
                pass
            else:
                self.sendmail(self.receiver, "进程监测", "parser进程变成了僵尸进程!请检测原因")
            if process3.is_running and process3.status() != psutil.STATUS_ZOMBIE:
                pass
            else:
                self.sendmail(self.receiver, "进程监测", "receiver进程变成了僵尸进程!请检测原因")
            time.sleep(5)

启动脚本start.py

from receiver import Recver                                                                                                                                                                                                                        
from parser import Parser                                                                               
from publisher import Publisher                                                                         
from monitor import Monitor                                                                             
import multiprocessing                                                                                  
                                                                                                                                                                                                                                                                                                                    
queue1 = multiprocessing.Queue(maxsize=5)                                                               
queue2 = multiprocessing.Queue(maxsize=5)                                                               
queue_pid = multiprocessing.Queue(maxsize=3)                                                            
                                                                                                        
                                                                                                                                                                                                                                                                                                         
if __name__ == '__main__':                                                                              
    jieshou = Recver()                                                                                  
    jiexi = Parser()                                                                                    
    publisher = Publisher()                                                                             
    monitor = Monitor()                                                                                 
    process1 = multiprocessing.Process(target=jieshou.recver, args=(queue1,), daemon=True)              
    process2 = multiprocessing.Process(target=jiexi.parser, args=(queue1, queue2), daemon=True)         
    process3 = multiprocessing.Process(target=publisher.publish, args=(queue2,), daemon=True)           
    process1.start()                                                                                    
    process2.start()                                                                                    
    process3.start()                                                                                    
    target_pid = (process1.pid, process2.pid, process3.pid)                                             
    process4 = multiprocessing.Process(target=monitor.checkprocess, args=(target_pid,), daemon=True) 
    process4.start()                                                                                    
    process1.join()                                                                                     
    # process2.join()

运行结果:

在这里插入图片描述
在传过来20时process2报错
在这里插入图片描述

收到的告警邮件
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python multiprocessing多进程编程,进程间通信,psutil监控进程状态并通过电子邮件告警 的相关文章

  • [USB波形分析] 全速USB波形数据分析(一)

    在之前的文章一次CAN波形分析之旅里 xff0c 根据示波器采集的波形数据 xff0c 详细地分析了CAN通信 今天来分析USB数据 xff0c 还是同样的流程 xff0c 但是这次使用matplotlib来协助分析 USB基本波形 USB
  • [USB波形分析] 全速USB波形数据分析(二)

    在上一篇文章全速USB波形数据分析 一 介绍了全速USB的数据包 Packet 的组成 xff0c 数据的类型等基本知识 这篇文章介绍USB的几种传输方式 事务 Transaction USB协议定义了三种不同的事务 Transation
  • STM32的PCROP代码保护功能

    软件供应商们在致力于开发属于自己的知识产权的软件产品 xff0c 尤其是那些中间件产品的同时 xff0c 如何保护这些知识产权 IP 实际上也是他们非常关心和重视的问题 基于各类微处理器的嵌入式产品对IP保护的要求也日益明显和迫切 为了满足
  • 人类高质量芯片工程师的那些“黑话”

    1 xff1a 计划 A xff1a 你们项目组芯片什么时间TO xff1f B xff1a 年底 A MPW B 直接FULL MASK A xff1a 有钱 B xff1a 芯片面积太大 xff0c 占了6个SEAT xff0c 况且年
  • Keil MDK各版本及pack包下载

    转自安富莱 MDK5 29 xff0c 5 30 xff0c 5 31 xff0c 5 32 xff0c 5 33 5 34 xff0c 5 35 5 36 5 37和各种pack软件包镜像下载 xff08 2022 05 04 xff09
  • g2o非线性优化架构详解图

    流程 xff1a 1 每次添加边的时候 xff0c 会对jacobian workspace更新size xff0c 最终size等于所有边中顶点相关顶点数量最多的顶点数 xff1b 这样做的原因是所有边求解雅克比矩阵 xff0c 用的是同
  • 利用协方差约束单个方向的g2o写法

    由于匹配结果有时候只约束单个方向 xff0c 比如法向 xff0c 因此需要考虑只约束部分方向的误差方程写法 xff0c 虽然可以使用自定义边 xff0c 但经过测试 xff0c 自定义欧式距离边加上位姿的求解通常不能收敛 xff0c 因此
  • 双目相机融合(五)

    预备中
  • 转贴:黑客高手必懂基础内容 (发在这里只为娱乐大家)

    转贴 xff1a 黑客高手必懂基础内容 发在这里只为娱乐大家 黑客高手必懂基础内容 一楼 xff1a DOS命令大全 二楼 xff1a TCP端口 作用 漏洞 操作详析 三楼 xff1a 开始 运行 命令 集锦 四楼 xff1a IPC 空
  • 大数据平台架构设计探究

    近年来 xff0c 随着IT技术与大数据 机器学习 算法方向的不断发展 xff0c 越来越多的企业都意识到了数据存在的价值 xff0c 将数据作为自身宝贵的资产进行管理 xff0c 利用大数据和机器学习能力去挖掘 识别 利用数据资产 如果缺
  • ros 解析激光点云的强度信息

  • 国外程序员整理的 C++ 资源大全

    转 xff1a http www csdn net article 2014 10 24 2822269 c 43 43 C 43 43 是在C语言的基础上开发的一种集面向对象编程 泛型编程和过程化编程于一体的编程语言 应用较为广泛 xff
  • Oracle、MySQL、SQL Server数据库的jdbc连接驱动配置

    Oracle MySQL SQL Server数据库的jdbc连接驱动配置 Oracle jdbc driver 61 oracle jdbc driver OracleDriver 或者 oracle jdbc OracleDriver
  • PID调参详解1

    PID调参详解1 xff08 比例环节 xff09 PID控制中有P I D三个参数 xff0c 只有明白这三个参数的含义和作用才能完成控制器PID参数调整 下面我们分别通过实例来分析比例微分积分三个环节对系统输出的影响 上式为PID控制器
  • NVIDIA NX刷机,配置深度学习环境

    买来的NVIDIA NX自带了一个sd卡和一个ssd卡 xff0c 刚开始按照sdkmanager去安装系统 xff0c 结果安装后发现装到了sd卡上 xff0c 后又根据视频教程在ssd上安装了系统 xff0c 最后配置了深度学习的环境
  • 串口调试助手VC源程序及详细编程过程

    串口调试助手VC源程序 及编程详细过程 作者 xff1a 龚建伟 可以任意转载 xff0c 注明作者和说明来自 龚建伟技术主页 目次 xff1a 1 建立项目 2 在项目中插入MSComm控件 3 利用ClassWizard定义CMSCom
  • linux 下 pytorch 安装

    我的显卡是gtx 730M 已经安装linux版本的驱动 xff0c 安装环境centos8 xff0c 内核版本Linux localhost localdomain 4 18 0 305 19 1 el8 4 x86 64 1 xff0
  • 章文嵩:怎样做开源才有意义?

    转至 xff1a http www infoq com cn interviews how to make open source meaningful utm campaign 61 infoq content amp utm sourc
  • seL4 构建和测试

    转载至 xff1a https source2014 hackpad com seL4 IJItb9IDncR 取得核心程式碼 預先設定好 Toolchain http sel4 systems Download DebianToolCha
  • [小技巧] ping 的时间间隔

    ping 可以选择间隔一段时间的间隔值 使用 i 命令 参考 xff1a 隔一秒钟ping一次 ping i 1 127 0 0 1 PING 127 0 0 1 127 0 0 1 56 84 bytes of data 64 bytes

随机推荐

  • [R语言] quantmod 包获取国内的股票数据

    2016 05 09追加 xff1a 对应的quantmod包相关说明参考 http www quantmod com quantmod 包默认是访问 yahoo finance 的数据 xff0c 其中包括上证和深证的股票数据 xff0c
  • 文件名日文乱码处理

    文件名出现日文乱码的话可以用如下命令解决 xff1a convmv r t utf 8 notest path to dir 另外 xff0c 压缩的 zip 解压时使用如下命令 xff1a unzip Ocp932 path to zip
  • can 总线介绍

    CAN xff0c 全称为 CONtroller Area Network xff0c 即控制器局域网 xff0c 是国际上应用最广泛的现场总线之一 最初 xff0c CAN被设计作为汽车环境中的微控制器通讯 xff0c 在车载各电子控制装
  • python 的 do ~ while 语法

    本文摘至 http ama ch hatenablog com entry 20080425 1209110237 Python不支持do while语法 while xff08 无限循环 xff09 和break组合起来替换 do whi
  • 802.11协议帧格式、Wi-Fi连接交互过程、无线破解入门研究

    本文转载至 xff1a http www cnblogs com littlehann p 3700357 html 目录 1 802 11标准简介 2 802 11协议格式 3 Wi Fi认证过程 4 802 11标准中的数据安全加密协议
  • Make 命令教程

    转载至 xff1a http www ruanyifeng com blog 2015 02 make html 作者 xff1a 阮一峰 日期 xff1a 2015年2月20日 代码变成可执行文件 xff0c 叫做编译 xff08 com
  • Python中用于计算对数的log()方法

    本文转载至 xff1a http www jb51 net article 66130 htm 这篇文章主要介绍了Python中用于计算对数的log 方法 是Python入门基础中的必会的方法 需要的朋友可以参考下 log 方法返回x的自然
  • RT-Thread创始人熊谱翔: 我和Linux、嵌入式实时操作系统RT-Thread

    本文转载至 xff1a http www rt thread org dynamic 78 html 接触 Linux 说起 Linux应该从我在校园时期说起 我是在山城 重庆邮电学院念的书 xff0c 1998年时宿舍伙伴一起凑的钱买的电
  • 到底什么是Unikernel?

    本文转载至 xff1a http dockone io article 855 utm source 61 tuicool amp utm medium 61 referral 编者的话 本文介绍了一种新的应用虚拟化技术 xff0c 它让应
  • xauth: “timeout in locking authority file /home/<user>/.Xauthority”?

    本文转载至 xff1a http unix stackexchange com questions 215558 why am i getting this message from xauth timeout in locking aut
  • 小技巧:检查你本地及公共 IP 地址

    本文转载至 xff1a https linux cn article 8207 1 html utm source 61 rss amp utm medium 61 rss 你本地的 IP 地址 xff1a 192 168 1 100 上面
  • Inside Real-Time Linux

    本文转载于 xff1a https www linux com news event elce 2017 2 inside real time linux Real time Linux has come a long way in the
  • [小技巧] vim中使用cscope时不区别大小写

    cscope 有 C 这么一个选项 C Ignore letter case when searching vim 里使用 cscope 不区别大小写可以使用下面一个技巧 xff1a set csprg 61 usr bin ra csco
  • PWM占空比和电机转速有什么线性关系

    可以看电机拖动一书 xff0c 里面讲了电机的建模 由于PWM波频率很高 xff0c 一般认为接在电机两端的电压平均值有如下关系 xff1a 假如占空比为a xff0c 驱动板供电电压为U xff0c 则电机两端电压Ud 61 a U 对于
  • SIFT特征点提取及描述论文算法详解

    SIFT特征点提取及描述论文算法详解 1 尺度空间极值检测 Scale space extrema detection 1 1 尺度空间和极值1 2 DoG和LoG的关系1 3 构建高斯尺度差分空间Tips 2 极值点定位 Keypoint
  • 国科大计算机视觉20-21考题

    国科大计算机视觉20 21考题 SIFT检测及描述流程 xff08 20分 xff09 相机成像模型 xff08 16分 xff09 两视图的稀疏重建 xff08 16分 xff09 LM算法流程 xff08 16分 xff09 PCA的思
  • Ubuntu18.04关闭内核自动更新安装之前版本

    Ubuntu18 04关闭内核自动更新安装之前版本 回退的原因 xff0c 上一周安装了Ubuntu18 04双系统 xff0c 主机型号是外星人 Asura R6 xff0c 安装完毕后可以正常进入Ubuntu xff0c 但是关机的时候
  • Windows10配置MongoDB

    Windows10安装MongoDB并配置 1 安装2 安装完成后启动服务器2 1 一次性启动2 2 设置为服务 xff0c 开机自启动 3 添加环境变量 xff0c 方便在cmd任何目录中直接启动 参考链接 xff1a https www
  • Ubuntu18.04编译ORB-SLAM3及遇到的一些问题

    测试环境 xff1a 系统 xff1a Ubuntu18 04Eigen 3 3 4 查看Eigen3版本的方法Pangolin 0 6OpenCV 3 4 14ROS Melodic 一 安装依赖 ORB SLAM的各项依赖里OpenCV
  • Python multiprocessing多进程编程,进程间通信,psutil监控进程状态并通过电子邮件告警

    python多进程编程 进程监测 一 mutiprocessng多进程编程和通信二 进程监测分析 三 Python邮件发送功能四 完整代码运行结果 xff1a 服务器上的web后端经常需要同时运行多个进程 xff0c 各个进程之间需要交换数