【Python】进程与线程实现子进(线)程终止,另一个子进(线)程继续执行,不干扰

news/2024/4/17 7:57:35

需求:
1.一个工具有两个子进程,分别是进程A与进程B,现在情况是其中一个进程A出现异常停止,另一个进程B也被终止了;现在想进程A终止的时候,进程B继续运行,如何实现,给出python代码示例;
2.一个工具有两个子线程,分别是线程A与线程B,现在情况是其中一个线程A出现异常停止,另一个线程B也被终止了;现在想线程A终止的时候,线程B继续运行,如何实现,给出python代码示例;

进程实现

在Python中,可以使用multiprocessing模块来创建进程。为了确保当进程A出现异常时,进程B能够继续运行,您需要为每个进程使用Process对象,并为它们设置适当的错误处理机制。
以下是一个简单的示例,展示了如何创建两个子进程,并确保当进程A出现异常时,进程B能够继续运行:

import multiprocessing
import time
import os
# 定义进程A的运行函数
def process_a():print(f"Process A is running, PID: {os.getpid()}")# 模拟异常情况1 / 0
# 定义进程B的运行函数
def process_b():print(f"Process B is running, PID: {os.getpid()}")time.sleep(5)  # 进程B运行5秒
if __name__ == "__main__":# 创建进程ApA = multiprocessing.Process(target=process_a)# 创建进程BpB = multiprocessing.Process(target=process_b)# 启动进程A和进程BpA.start()pB.start()# 等待进程A和进程B完成pA.join()pB.join()print("All processes have finished.")

在这个示例中,进程A会尝试执行除以零的操作,这将引发一个异常,导致进程A终止。然而,由于进程B的join()方法会在进程B结束或超时后返回,进程B将在进程A终止后继续运行5秒钟。
需要注意的是,这个示例仅用于演示目的,实际应用中通常不建议通过引发异常来终止进程。相反,应该使用更优雅的错误处理和通信机制,例如使用进程间通信(IPC)方法,例如multiprocessing.Queue()multiprocessing.Pipe()等,来协调进程间的操作。

线程实现

在Python中,可以使用threading模块来创建线程。为了确保当线程A出现异常停止时,线程B能够继续运行,你需要为每个线程使用Thread对象,并为它们设置适当的错误处理机制。
以下是一个简单的示例,展示了如何创建两个线程,并确保当线程A出现异常时,线程B能够继续运行:

import threading
import time
# 定义线程A的运行函数
def thread_a():try:print(f"Thread A is running, ID: {threading.get_ident()}")# 模拟异常情况1 / 0except Exception as e:print(f"Thread A encountered an exception: {e}")
# 定义线程B的运行函数
def thread_b():print(f"Thread B is running, ID: {threading.get_ident()}")time.sleep(5)  # 线程B运行5秒
if __name__ == "__main__":# 创建线程Ata = threading.Thread(target=thread_a)# 创建线程Btb = threading.Thread(target=thread_b)# 启动线程A和线程Bta.start()tb.start()# 等待线程A和线程B完成ta.join()tb.join()print("All threads have finished.")

在这个示例中,线程A会尝试执行除以零的操作,这将引发一个异常,导致线程A终止。然而,由于线程B的join()方法会在线程B结束或超时后返回,线程B将在线程A终止后继续运行5秒钟。
需要注意的是,这个示例仅用于演示目的,实际应用中通常不建议通过引发异常来终止线程。相反,应该使用更优雅的错误处理和通信机制,例如使用线程间通信方法,例如通过共享变量或使用threading.Event对象来协调线程间的操作。


https://www.xjx100.cn/news/3293503.html

相关文章

Spring08、使用注解开发

8、使用注解开发 8.1、说明 在spring4之后&#xff0c;想要使用注解形式&#xff0c;必须得要引入aop的包 在配置文件当中&#xff0c;还得要引入一个context约束 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.sprin…

搭建XSS 测试平台

XSS 测试平台是测试XSS漏洞获取cookie并接收Web 页面的平台&#xff0c;XSS 可以做 JS能做的所有事&#xff0c;包括但不限于窃取cookie、后台增删改文章、钓鱼、利用XSS漏洞进 行传播、修改网页代码、网站重定向、获取用户信息(如浏览器信息、IP 地址)等。这 里使用的是基于x…

[设计模式Java实现附plantuml源码~行为型] 对象状态及其转换——状态模式

前言&#xff1a; 为什么之前写过Golang 版的设计模式&#xff0c;还在重新写Java 版&#xff1f; 答&#xff1a;因为对于我而言&#xff0c;当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言&#xff0c;更适合用于学习设计模式。 为什么类图要附上uml 因为很…

嵌出式工程师小小知识点006

二极管作用 1.整流&#xff1a;利用二极管单向导电性&#xff0c;可以把方向交替变化的交流电zhi变换成单一方向的脉冲直流电 2.、开关&#xff1a;二极管在正向电压作用下电阻很小&#xff0c;处于导通状态&#xff0c;相当于一只接通的开关&#xff1b;在反向电压作用下&…

為什麼使用海外動態代理IP進行網路爬蟲?

網路爬蟲作為獲取網路數據的重要工具&#xff0c;其重要性不言而喻。但隨著網站反爬策略的日益嚴格&#xff0c;爬蟲任務變得愈發困難&#xff0c;不過海外動態代理IP可以很好地解決這一問題。本文將詳細闡釋動態代理IP在爬蟲中的應用&#xff0c;以及如何使用動態代理IP提升爬…

oracle 如何使用脚本实现访问控制(无需额外插件)

随着这些年勒索病毒的爆发,各个企业对数据安全的要求越来越高,常见的办法有开启数据库审计,加数据库防火墙,网络限制等等;但是细粒度审计会消耗大量系统资源,第三方数据库防火墙一般是需要收费的;这里介绍我个人常用的四个db级别trigger,用于记录部分关键信息可以应对部…

MySQL的锁(简单入门)

文章目录 前言全局锁表级锁行级锁总结 前言 今天来讲一讲 MySQL 的锁&#xff0c;一个简单的入门。 MySQL 锁&#xff0c;分为全局锁&#xff0c;表级锁&#xff0c;行级锁&#xff0c;三个锁按照名字的颗粒度来算是越来越小的。锁越大性能越差&#xff0c;InnoDB 默认的是行…

进程的通信以及信号的学习

一&#xff0c;进程的通信&#xff1a; 种类&#xff1a;1.管道 2.信号 3.消息队列 4.共享内存 5.信号灯 6.套接字 1.管道: 1.无名管道 无名管道只能用于具有亲缘关系的进程间通信 pipe int pipe(int pipefd[2]); 功能: 创建一个无名管道 …