Python 线程的自修复

news2024/9/23 17:14:14

在 Python 中,线程的自修复通常涉及异常处理和适当的线程管理。在线程的 run() 方法中使用 try-except 块来捕获可能发生的异常。在捕获异常后,可以记录异常信息或者尝试重新启动线程以恢复正常运行。下面看看我最近的一个实操案例。

在这里插入图片描述

1、问题背景

我创建了一个访问米国和欧某盟服务器的网络蜘蛛。米国和欧某盟的服务器是相同的数据结构,但内部的数据不同,我想把它们全部整理出来。为了对服务器友好,每次请求之间都会有一个等待时间。由于程序完全相同,为了加快处理速度,我将程序进行了多线程处理,以便可以同时访问欧某盟和米国服务器。这个爬取过程大约需要几周,而不是几天。会出现异常,虽然我试图在程序内部处理所有内容,但很可能会出现一些奇怪的问题。为了真正防御这个问题,我想捕获一个出现故障的线程,记录错误并重新启动它。最坏的情况是,我从数千页中丢失了几页,这比线程出现故障而损失 50% 的速度要好。然而,根据我的阅读,Python 线程会静默地死去。有没有人有什么想法?

class AccessServer(threading.Thread):
    def __init__(self, site):
        threading.Thread.__init__(self)
        self.site = site
        self.qm = QueueManager.QueueManager(site)

    def run(self):
        # Do stuff here


def main():
    us_thread = AccessServer(u"us")
    us_thread.start()

    eu_thread = AccessServer(u"eu")
    eu_thread.start()

2、解决方案

方法一:

run 方法中使用一个 try: ... except: ... 块。如果发生某种奇怪的事情导致线程失败,很可能会在代码的某个地方抛出一个错误(而不是在多线程子系统本身中);这样你就可以捕获它,对其进行记录,并重新启动线程。是否要实际关闭线程并启动一个新线程,或者只是将 try/except 块包含在一个 while 循环中,以便同一个线程继续运行,由你决定。

方法二:

如果怀疑可能会发生一些非常奇怪的事情,而你无法通过 Python 的错误处理机制来检测到,另一个解决方案是启动一个监视线程,定期检查其他线程是否正常运行。

代码示例:

import threading
import Queue

class AccessServer(threading.Thread):
    def __init__(self, site):
        threading.Thread.__init__(self)
        self.site = site
        self.qm = QueueManager.QueueManager(site)

    def run(self):
        try:
            # Do stuff here
        except Exception as e:
            # Log the error
            print(f"Error: {e}")
            # Restart the thread
            self.run()

def main():
    us_thread = AccessServer(u"us")
    us_thread.start()

    eu_thread = AccessServer(u"eu")
    eu_thread.start()

或者:

import threading
import time

class AccessServer(threading.Thread):
    def __init__(self, site):
        threading.Thread.__init__(self)
        self.site = site
        self.qm = QueueManager.QueueManager(site)

    def run(self):
        while True:
            try:
                # Do stuff here
            except Exception as e:
                # Log the error
                print(f"Error: {e}")
                # Restart the thread
                self.run()

def main():
    us_thread = AccessServer(u"us")
    us_thread.start()

    eu_thread = AccessServer(u"eu")
    eu_thread.start()

def monitor_threads():
    while True:
        # Check if the threads are still running
        if not us_thread.is_alive() or not eu_thread.is_alive():
            # Restart the threads
            us_thread = AccessServer(u"us")
            us_thread.start()

            eu_thread = AccessServer(u"eu")
            eu_thread.start()

        # Sleep for a bit
        time.sleep(1)

# Start the monitor thread
monitor_thread = threading.Thread(target=monitor_threads)
monitor_thread.start()

通过上面的这些方法,最终我们可以在 Python 中实现一定程度的线程自修复功能,确保线程在遇到异常时能够进行适当的处理,从而提高程序的稳定性和可靠性。

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

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

相关文章

bugku.ctf ---WEB(还有后续)

bugku.ctf ---WEB 1.Simple_SSTI_1 1.启动场景 2. 页面说你需要输入一个名为flag的参数。 3.查看网页源代码,提示在flask中,设置了secret_key。意思是在注入模板中输入内容就会显示对应的值。 4.传入?flag{{config.SECRET_KEY}}显示flag 2.Simple_SST…

【Android】安卓多媒体之通知、摄像头、相册、播放音乐、视频用法总结

文章目录 一、通知1. 申请权限2. 创建通道3. 创建通知4. 发送通知拓展功能点击行为更新通知取消通知锁屏通知富文本通知 二、摄像头1. 申请权限2. 调用逻辑3. 声明内容提供器 三、打开相册1. 申请权限检查并请求权限处理权限请求结果 2.处理图片从相册中选择图片处理选择图片的…

反应力场lammps和reaxff,再加上智能计算模拟,你恐怕没见过这种绝妙组合

“第一性原理分子动力学机器学习”三位一体的综合手段,已经成为模拟计算的一个前沿方向,为解决传统计算化学方法面临的挑战提供了新的解决方案。国内外已有科研团队在深化第一性原理与分子动力学的研究与应用拓展,利用机器学习优化大规模计算…

yolov5训练的pt模型,转换为rknn并部署在瑞芯微RK3588开发板

一、下载源码 在GitHub中搜索并下载yolov5的源代码,然后放在自己部署好的项目环境。 直接用下面的命令即可部署适合yolov5的环境,至于缺什么库,什么版本不对的可以百度查一下。 pt模型转onnx模型 我这里已经把源码下载好并加载好了我的虚拟…

Redis CLI常用命令

Redis CLI常用命令 1. 设置和获取数据 SET Redis 中的数据是以键值对的形式存储的,所以需要指定一个键和一个值,键和值用空格隔开; Redis 中默认使用字符串存储数据; 3. 删除键 DEL 4. 判断键是否存在 exists 5. 查找键 KEYS 查…

环境参数自动调节设备:智能生活的绿色守护者

在当今社会,随着科技的飞速发展和人们生活水平的不断提升,对居住环境的要求也日益增高。一个舒适、健康的生活空间,不仅关乎温度、湿度、空气质量等基本环境因素,还涉及到光照、噪音控制等多个维度。为了满足这些多元化的需求&…

【Docomo】5G

我们想向您介绍第五代移动通信系统“5G”。 5G 什么是5G?支持5G的技术什么是 5G SA(独立)?实现高速率、大容量的5G新频段Docomo的“瞬时5G”使用三个宽广的新频段 什么是5G? 5G(第五代移动通信系统&#x…

技术设计评审的重要性及实战指南:让每一行代码都熠熠生辉

在这个快速迭代的软件开发时代,技术设计评审(Technical Design Review, 简称TDR)不仅是项目成功的关键一环,更是每位程序员职业生涯中不可或缺的“导航灯”。它如同一面镜子,让团队能够清晰地看到设计的全貌,及时修正偏差,确保项目朝着既定的目标稳健前行。关注【程序员…

服务器给根目录扩展磁盘(不使用lvm逻辑券)两种方式

因业务需求磁盘存储增加现在需要给/目录进行扩容,因为是云服务器直接在原有的磁盘增加了100G空间现在把新增的100G扩容到/目录分区。 有两种方法一种是使用growpart 工具扩容,一种是使用fdisk命令 使用growpart工具扩容 yum install -y cloud-utils-grow…

为什么我工作 10 年后转行当程序员?逆袭翻盘!

今天文章的主人公暂且称他为 A 君。不过 A 君有点特别,非科班,工作 10 年后才转行 iOS 程序员。今年 36 岁,目前在某行业头部企业任职前端负责人,管理 40 人的前端团队。 废话不多说,我们开始 A 君(为了描…

并发编程工具集——Future(二十七)

简介: 创建完线程池,该如何使用获取任务的执行结果(execute() 方法没有返回值)。 如何获取任务执行结果 Java 通过 ThreadPoolExecutor 提供的 3 个 submit() 方法和 1 个 FutureTask 工具类来支持获得任务执行结果的需求。三个su…

2024年哪些充电宝建议买?最建议买的四款充电宝排行榜!

在 2024 年,充电宝依然是我们生活中不可或缺的电子伴侣。然而,面对市场上众多的充电宝品牌和型号,要挑选到一款既实用又安全可靠的产品并非易事。充电宝的安全性至关重要,毕竟它与我们随身携带的电子设备紧密相连。劣质的充电宝可…

C++软件开发值得推荐的十大高效软件分析工具

目录 1、概述 2、高效软件工具介绍 2.1、窗口查看工具SPY++ 2.2、Dependency Walker 2.3、剪切板查看工具Clipbrd 2.4、GDI对象查看工具GDIView 2.5、Process Explorer 2.6、Prcoess Monitor 2.7、API Monitor 2.8、调试器Windbg 2.9、反汇编工具IDA 2.10、抓包工…

[240801] 类 C 语言 C3 是一种进化,而不是一场革命 | 趣文: find + mkdir 是图灵完备

目录 类 C 语言 C3 是一种进化,而不是一场革命C3 编程语言特征C3 设计原则安装 C3 编程语言第一个 C3 项目 趣文:find mkdir 是图灵完备 类 C 语言 C3 是一种进化,而不是一场革命 C3 是基于 C 的编程语言,它是 C 的一种演变&…

2024最新全开源付费进群系统源码二开修复版 支持易支付

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 全开源付费进群系统源码,开源无加密无授权,优化电脑端访问布局,支持dai理,对接易支付通道,dai理可以配置自己易支付接口&am…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第四篇 嵌入式Linux系统移植篇-第七十二章 内核配置屏幕驱动

i.MX8MM处理器采用了先进的14LPCFinFET工艺,提供更快的速度和更高的电源效率;四核Cortex-A53,单核Cortex-M4,多达五个内核 ,主频高达1.8GHz,2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

ChatGPT:数据库不符合第二范式示例

ChatGPT:数据库不符合第二范式示例 这张图片为什么不符合数据库第二范式 这个表格不符合数据库第二范式(2NF)的原因如下: 1. 数据库第二范式(2NF)定义 第二范式要求一个数据库表格在满足第一范式&#xf…

【Hot100】LeetCode—169. 多数元素

目录 题目1- 思路2- 实现⭐169. 多数元素——题解思路 3- ACM 实现 题目 原题连接:169. 多数元素 1- 思路 定义两个变量 一个是 count:维护当前元素的出现次数一个是 ret :维护当前元素 思路 遍历整个数组**①如果 count 0 **&#xff…

了解对称加密与密钥协商技术

1.对称加密算法 加密的理论基础是替代和换位。替代主要用于扰乱,使用不同的位、字符或字符分组来替换原来的位、字符或字符分组。换位主要用于扩散,并不使用不同的文本来替换原来的文本,而是对原有的值进行置换,即重新排列原来的位…

Django开发企业官网

1.在本地创建一个website的文件夹,在vc里面打开文件夹 2.创建虚拟环境和安装django 终端执行命令 python -m venv venv(创建一个虚拟文件名字叫venv) venv\Scripts\activate(启动虚拟环境) pip install django(安装django&#x…