【python实现通过复数进程互相检测防止关闭和删除】

news2025/1/11 12:44:39

python实现通过复数进程互相检测防止关闭和删除

在这里插入图片描述
在这里插入图片描述

要使用 Python 实现通过多个进程互相检测来防止关闭和删除,可以使用 multiprocessing 模块来创建多个进程,并通过进程间通信来实现心跳检测。以下是一个简单的示例代码,展示了如何使用两个进程相互监控:

首先,创建一个共享数据结构,用于进程间通信和存储心跳信息:

import multiprocessing
import time

# 共享状态
shared_data = multiprocessing.Value('d', time.time())  

然后,定义进程函数,该函数会不断更新共享数据中的心跳值:

def process_function(shared_data):
    while True:
        # 模拟进程工作
        time.sleep(1)  
        # 更新心跳
        shared_data.value = time.time()  

接下来,创建进程并启动:

process1 = multiprocessing.Process(target=process_function, args=(shared_data,))
process1.start()

在主进程中,定期检查心跳。如果发现心跳超时(即另一个进程异常退出),则打印提示信息并重新创建进程:

while True:
    time.sleep(2)  
    if time.time() - shared_data.value > 3:  
        print("heartbeat lost! restarting the process.")
        process1.terminate()  
        process1.join()  
        process1 = multiprocessing.Process(target=process_function, args=(shared_data,))
        process1.start()  

在上述示例中,两个进程通过共享的 shared_data 进行心跳检测。主进程每隔 2 秒检查一次心跳,如果超过 3 秒没有更新(意味着另一个进程可能已经异常退出),则终止并重新启动该进程。

完整示例

import multiprocessing
import time

# 共享状态
shared_data = multiprocessing.Value('d', time.time())  

def process_function(shared_data):
    """
    进程函数,用于更新共享数据中的心跳值
    """
    while True:
        time.sleep(2)
        shared_data.value = time.time()  

if __name__ == "__main__":
    """
    主程序
    """
    process1 = multiprocessing.Process(target=process_function, args=(shared_data,))
    process1.start()

    while True:
        time.sleep(3)
        if time.time() - shared_data.value > 5:
            print("Heartbeat lost! Restarting the process.")
            process1.terminate()
            process1.join()
            process1 = multiprocessing.Process(target=process_function, args=(shared_data,))
            process1.start()

在这个示例中,if __name__ == "__main__": 下面的代码就是主程序。

要运行这个程序,直接运行这个 Python 脚本即可。在运行时,它会启动一个进程 process1 执行 process_function 函数,主程序会不断检测心跳是否丢失,并在丢失时重新启动进程。
这段 Python 代码主要实现了一个多进程的心跳监测机制:

  1. 首先导入了 multiprocessingtime 模块。
  2. 创建了一个共享数据 shared_data,其类型为双精度浮点数,并初始化为当前时间。

在定义的 process_function 函数中:

  • 这是一个在新进程中执行的函数,它会不断循环。
  • 每 2 秒更新一次 shared_data 的值为当前时间。

在主程序部分:

  • 创建了一个名为 process1 的新进程,并指定其执行 process_function 函数,并传递共享数据作为参数。
  • 然后进入一个主循环。
  • 每 3 秒检查一次共享数据的最新值。
  • 如果当前时间与共享数据中的时间差超过 5 秒,就认为心跳丢失。
  • 终止当前进程,等待其结束。
  • 重新创建新进程并启动,以重新开始心跳监测。

例如,如果在某个时刻,进程 process1 由于某种原因停止更新共享数据,那么在 5 秒后,主程序会检测到并采取重新启动进程的措施,以确保心跳的持续更新。这种机制常用于需要持续监测某个进程是否正常运行的场景。

代码优化

在Python中,我们可以使用multiprocessing模块来创建多个子进程,并通过这些子进程之间的通信来实现互相检测的功能。要防止某个进程被关闭或被删除,一种方法是让每个进程不断地检查其他进程的状态,并在其他进程退出时重新启动它们。

下面这个示例,将展示如何创建两个子进程,它们会互相监控对方的存在,并在对方消失时尝试重新启动对方:

import os
import time
import multiprocessing
from multiprocessing import Process

def monitor(pid):
    while True:
        # 检查目标进程是否存在
        if not os.path.exists(f"/proc/{pid}"):
            print(f"Process {pid} is down, restarting...")
            try:
                p = Process(target=target_function)
                p.start()
            except Exception as e:
                print(f"Failed to restart process: {e}")
        time.sleep(1)  # 避免过度消耗CPU

def target_function():
    pid = os.getpid()
    print(f"Process {pid} started.")
    
    while True:
        time.sleep(1)

def main():
    # 创建两个子进程
    p1 = Process(target=target_function)
    p2 = Process(target=target_function)
    
    p1.start()
    p2.start()
    
    # 获取进程ID
    pid1 = p1.pid
    pid2 = p2.pid
    
    # 创建监控进程
    monitor_p1 = Process(target=monitor, args=(pid1,))
    monitor_p2 = Process(target=monitor, args=(pid2,))
    
    monitor_p1.start()
    monitor_p2.start()

if __name__ == "__main__":
    main()

解释:

  1. 主进程 (main()) 启动两个子进程 p1p2
  2. 子进程 (target_function()) 无限循环运行,模拟一个不中断的任务。
  3. 监控进程 (monitor()) 不断检查指定的进程是否还在运行。如果检测到进程不存在(即被杀掉或自己停止),则尝试重新启动该进程。

请注意,这种方法并不能真正“防止”进程被操作系统或用户关闭,只能在进程意外终止后尝试恢复它。此外,这种方式可能会导致系统资源的过度消耗,特别是在处理大量进程或者频繁重启的情况下。

另外,在实际部署这种机制之前,请确保你理解其潜在的影响,并根据需要调整睡眠时间和异常处理逻辑。

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

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

相关文章

【学术前沿】基于非易失性存储器硬件特性的存算一体神经网络设计方法

【学术前沿】基于非易失性存储器硬件特性的存算一体神经网络设计方法 Lixia HAN, Peng HUANG, Yijiao WANG, Zheng ZHOU, Haozhang YANG, Yiyang CHEN, Xiaoyan LIU & Jinfeng KANG, Mitigating Methodology of Hardware Non-ideal Characteristics for Non-volatile Memo…

经常打喷嚏和浮毛猫毛满天飞有关吗?能去浮毛的空气净化器推荐

近年来,随着生活品质的提升,越来越多的家庭选择养宠物,养宠物的同时也带来了不少的困扰。比如,下班归家,迎接的可能是满室的异味与漂浮的毛发,瞬间让好心情大打折扣。长期置身于这样的环境中还对健康有影响…

笔记本没电造成数据丢失怎么恢复?速览几种有效方法

在日常使用笔记本电脑的过程中,我们时常会遇到电量耗尽而突然关机的情况。这种突如其来的断电不仅可能打断我们的工作流程,更有可能导致未保存的数据丢失,给我们的生活和工作带来不小的困扰。面对这种情况,许多用户可能会感到手足…

Jellyfin10.9.x解决色调映射无法使用的问题

环境 物理机为12100的CPU、精粤 H610I的主板、16G2内存、闪迪1TB M.2固态、希捷酷鹰3.5寸4TB硬盘4。 物理机安装了PVE后在PVE安装了NAS、OP、Windows 10、HA、Ubuntu还利用LXC模板安装了Debian12 里面套娃了Jellyfin。不过我的Jellyfin不是部署在docker中的。 问题 但是当我…

NSSCTF练习记录:[SWPUCTF 2021 新生赛]ez_caesar

题目&#xff1a; import base64 def caesar(plaintext):str_list list(plaintext)i 0while i < len(plaintext):if not str_list[i].isalpha():str_list[i] str_list[i]else:a "A" if str_list[i].isupper() else "a"str_list[i] chr((ord(str_…

蓝队技能-应急响应篇勒索病毒系统样本家族解密渠道寄生入口异常定性处置封锁

知识点 1、应急响应-勒索病毒-定性&排查 2、应急响应-勒索病毒-应急&处置1、什么是勒索病毒&#xff1f; 勒索病毒是一种新型电脑病毒&#xff0c;主要以RDP爆破、邮件、程序木马、网页挂马的形式进行传播。该病毒性质恶劣、危害极大&#xff0c;一旦感染将给用户带来…

vue3 RouterLink路由跳转后RouterView组件未加载,页面未显示,且控制台无任何报错

在使用 vue3 开发项目过程中&#xff0c;组件之间使用 router-link 跳转&#xff0c;但是当我开发的组件跳转到其他组件时&#xff0c;其他组件的页面未加载&#xff0c;再跳转回自己的组件时&#xff0c;自己的组件也加载不出来了&#xff0c;浏览器刷新后页面可以加载出来。但…

点亮希望之灯:解决孩子自闭症的探索之路

在这个充满活力与挑战的世界里&#xff0c;有一群特殊的孩子&#xff0c;他们仿佛生活在自己的孤独星球上&#xff0c;难以与外界进行有效的沟通和互动。他们是自闭症儿童&#xff0c;也被称为 “星星的孩子”。面对这些孩子的自闭症问题&#xff0c;我们该如何寻找解决之道呢&…

C语言06--数组进阶

数组名含义 数组名有两个含义&#xff1a; 第一含义是&#xff1a;整个数组第二含义是&#xff1a;首元素的地址当出现以下情形时&#xff0c;那么数组名就代表整个数组&#xff1a; 在数组定义中在 sizeof 运算表达式中 &#xff0c;因此sizeof 计算的就是整个数组的大小。si…

《黑神话:悟空》风灵月影V1.0-35项修改器全面解析

《黑神话&#xff1a;悟空》作为一款备受瞩目的魂系动作角色扮演游戏&#xff0c;以其细腻的画面、流畅的操作和深厚的剧情吸引了众多玩家的关注。然而&#xff0c;对于不少玩家来说&#xff0c;游戏的高难度设置也带来了不小的挑战。为此&#xff0c;风灵月影工作室特别推出了…

[Spring] Spring原理(SpringBoot完结)

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

【15】Java字节码

Java方法栈帧的组成&#xff1a;操作数栈局部变量表 操作数栈 Java字节码是Java虚拟机所使用的的指令集。它与JVM基于栈的计算模型是分不开的。 在解释执行过程中&#xff0c;每当为 Java 方法分配栈桢时&#xff0c;Java 虚拟机往往需要开辟一块额外的空间作为操作数栈&…

JavaEE 第16节 线程安全的集合类

目录 前言 顺序表 队列 哈希表 1、Hashtable 2、ConcurrentHashMap&#xff08;重点&#xff09; 前言 本文章主要介绍在多线程环境下&#xff0c;如何线程安全的使用一些常用的集合类&#xff08;顺序表和哈希表&#xff09;。 顺序表 1、自己使用同步锁机制&#xff…

模拟笔试:卡码网2023年快手笔试真题

1.158同余方程 思路 纯数学的思路&#xff0c;想不出来的话很难做。 欧几里得算法视频讲解 代码 #include <iostream> using namespace std;// 扩展欧几里得&#xff1a;计算 ax by gcd(a, b) 的解 long long extended_gcd(long long a, long long b, long long &a…

Java语言程序设计——篇十五(5)

&#x1f33f;&#x1f33f;&#x1f33f;跟随博主脚步&#xff0c;从这里开始→博主主页&#x1f33f;&#x1f33f;&#x1f33f; 欢迎大家&#xff1a;这里是我的学习笔记、总结知识的地方&#xff0c;喜欢的话请三连&#xff0c;有问题可以私信&#x1f333;&#x1f333;&…

【STM32嵌入式系统设计与开发拓展】——16_FreeRTOS操作系统

参考&#xff1a;链接: 正点原子 一、认识裸机和RTOS 裸机是无操作系统支持&#xff0c;程序直接运行在硬件上&#xff0c;开发者要自行处理硬件细节。早期单片机常采用&#xff0c;优点是性能和资源利用率高&#xff0c;缺点是开发难、可移植性差。RTOS 是实时操作系统&…

vscode导入的包裹代码名称没有颜色

问题描述:代码其他染色正常,但是例如import torchtorch没有颜色,虽然能够识别(ctrl左键能够点进去看到torch代码) 解决: 下载extention pylancefile->preferences->settings, 搜索Python: Language Server, 从default改成pylance

JAVA—IO流

存储数据的方案File和文件数据的操作IO流&#xff0c;学习字节流和字符流&#xff0c;了解框架和IO框架Commons IO 目录 1.File &#xff08;1&#xff09;创建对象 &#xff08;2&#xff09;常用方法 【1】判断类型&#xff0c;获取信息 【2】创建文件&#xff0c;删除…

LNMP学习

一、LNMP—web 1. 概述 LNMP/LAMP linux/windows/unix apache/nginx mysql/pgsql php/jsp 2. nginx部署及其平滑升级 实操 3. nginx七层负载均衡及算法 算法参考文档&#xff1a;https://docs.nginx.com/nginx/admin-guide/load-balancer/http-load-balancer/ 实操 4…

flv格式转换mp4怎么转换?5个软件帮助你自己快速进行格式转换

flv格式转换mp4怎么转换&#xff1f;5个软件让你从此快速转换格式不求别人 将FLV格式的视频转换为MP4格式可以通过使用以下五款软件来轻松实现。这些工具操作简便&#xff0c;能够快速高效地完成视频格式的转换&#xff0c;让你轻松应对各种视频格式需求。 口袋视频转换器 这…