文件多线程读取下载+异步上传云存储

news2024/9/23 1:48:50

文章目录

    • 1. 前言
    • 2. 多线程读取下载+异步上传
      • 2-1. 多线程读取下载
      • 2-2. 异步上传异步更新cosUrl
    • 3. 线程池单个任务提交
    • 4. 关于异步上传的文件oosUrl地址返回问题

1. 前言

    实际开发中经常遇到,文件上传或者文件批量下载的任务。单线程下载大批量文件,排队处理会比较慢。读取下载+上传文件同步处理非常耗时。
    对于75M的视频文件读取下载耗时严重时达到20s左右,45M视频文件读取下载大概也要5-6s。同样大小的视频文件上传oos或者cos需要花5-8s。单线程读取下载+同步上传处理一个文件要花费25s左右。
    对于这种任务考虑文件读取下载引入多线程批量处理,上传文件动作改为异步处理。
    多线程批量读取上传可以提高文件读取下载的效率,并行处理多个文件的下载。
    异步上传可以释放上传动作的耗时时间,让主线程只关注读取下载文件动作即可。节省了文件上传的时间。

2. 多线程读取下载+异步上传

单线程读取下载+同步上传方案改为多线程读取下载+异步上传方案

业务场景背景:
下述方法是定时任务调用的文件转存储cos业务方法。对于待转存cos的文件,查出来之后,根据文件md5去重复,防止同文件重复上传耗资源。然后遍历对象,读取文件resourceUrl,下载到服务器临时目录,然后上传到cos云存储。并更新cosUrl到表记录。

2-1. 多线程读取下载

1、文件读取下载转存cos业务方法
    此处查出待转存的视频素材对象集合,根据文件md5去重复防止重复上传。
    引入ConcurrentHashMap记录文件上传结果,比如文件读取失败、下载失败、上传结果标识、失败原因等信息,ConcurrentHashMap线程安全。
    引入线程池,多线程批量读取下载文件,提高文件下载效率。
    引入Future或者CompletableFuture,批量提交任务并跟踪任务处理结果。使用 Future 对象列表来保存每个任务的执行结果,并在所有任务执行完毕后等待它们完成,确保所有任务都已经执行完毕后再继续执行后续操作。
    future.get()方法会等待当前线程任务执行完成,主线程中调用该方法相当于阻塞主线程,等待多线程中的任务执行完成后,才会往下执行。保证了多线程任务全部执行完成后,也就是批量读取下载文件完成后,再进行后续动作。
在这里插入图片描述

2、文件读取下载和上传业务方法
    文件读取下载,同步处理。文件上传调用异步方法,不需要等待上传完成即可返回。缩短了当前线程的执行时间。
在这里插入图片描述
3、文件同步读取下载
在这里插入图片描述

2-2. 异步上传异步更新cosUrl

1、文件异步上传cos
    @Async标识异步执行,默认使用框架内置线程池。
    也可以追加参数指定自定义线程池。比如@Async(“TranslatePool”),自定义一个bean如下所示。此处使用框架默认线程池。
在这里插入图片描述
2、自定义线程池
在这里插入图片描述

3. 线程池单个任务提交

    修改单线程读取下载+同步上传方案为多线程批量读取下载+异步上传,整体耗时更短,更高效。45M~75M大小不等的视频文件,15分钟大约可以处理完成1000条视频素材(仅作参考,不严谨)。包括文件读取下载、上传cos、更新cosUrl到表记录。
    注意线程池使用,任务提交尽量使用批量提交任务。批量提交任务,避免了每个任务都立即提交到线程池中,减少了线程池中的任务切换开销。
    单个提交任务,存在线程池的线程全部进行无限期等待状态的情况。
    在大批量任务,且任务处理比较耗时的场景下,由于单个任务提交很快。前面的任务都还没执行完成,后面的任务就提交了,导致只能等待,最后会出现全部核心线程进入无限期等待卡死。建议使用批量提交任务。
    通过jstack 命令分析进程ID的线程执行情况,在下面这种写法出现了线程全部无限期等待的情况。注意规避。
在这里插入图片描述
在这里插入图片描述

4. 关于异步上传的文件oosUrl地址返回问题

    如果上传文件后的存储地址,在上传前就可以拼接出来,可以在异步上传之前就拿到url等待入库。
    在上传动作之后才能拿到oosUrl的话,可以在异步任务中拿到url之后,单独根据业务标识更新对应记录的oosUrl。

参考文章:【代码片】文件多线程读取下载+异步上传云存储
Powered By niaonao

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

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

相关文章

灰狼算法优化elman神经网络回归分析,GWO-ELMAN回归分析

目录 背影 ELMAN神经网络的原理 ELMAN神经网络的定义 受限玻尔兹曼机(RBM) 灰狼算法原理 灰狼算法优化elman神经网络回归分析 基本结构 主要参数 数据 MATALB代码 结果图 展望 完整代码下载:灰狼算法优化ELMAN回归分析,GWO-ELMAN回归分析资源-CSDN文库 https://download.c…

Electron 多显示器渲染

Electron打出的包,如果当前有俩个显示器,则可以配置当前显示倒哪个显示器上,或者可以配置不同的显示器,启动不同的项目,只在Windows和Linux下测试过,Mac没有真机,可以利用docker安装MacOS环境&a…

苹果电脑免费释放磁盘空间软件CleanMyMac X2024

CleanMyMac X通过以下方式帮助用户释放磁盘空间: 智能扫描和清理:CleanMyMac X拥有强大的智能扫描功能,可以深入系统底层,快速识别并清理各类无用文件和垃圾,如缓存、日志、临时文件等。这些文件通常会占用大量的磁盘…

『运维备忘录』之 RegEx 正则表达式实例汇总

运维人员不仅要熟悉操作系统、服务器、网络等知识,甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作,持续给大家更新运维工作所需要接触到的知识点,希望大…

单片机入门:LED数码管

LED数码管 LED数码管:由多个发光二极管封装在一起组成的“8”字型的器件。如下图所示: 数码管引脚定义 一位数码管 内部由八个LED组成。器件有十个引脚。 对于数码管内的8个LED有共阴和共阳两种连接方法。 共阴:将8个LED的阴极都连接到一…

羊大师揭秘羊奶,古今皆宜的滋养佳品

羊大师揭秘羊奶,古今皆宜的滋养佳品 羊奶,这一被誉为“奶中之王”的天然饮品,自古以来就因其独特的营养价值和健康益处而备受推崇。在古代,羊奶就已经被用作滋补身体和增强免疫力的饮品。随着现代营养学研究的深入,羊…

聊聊最近成交的一个小外贸订单

聊聊最近的一个小订单的故事吧,这个客户是个新手买家,也属于第一次在网上购物,客户在年前开始询问产品,而且当时正好是假期。 其实按照正常的处理思路来说,应该告诉客户现在是假期,大概是在什么时候恢复工…

JavaWeb Request:获取请求数据

Request是请求对象,Response是响应对象。 浏览器会发送HTTP请求到后台服务器[Tomcat],请求中会包含很多请求数据 [请求行请求头请求体] ,后台服务器[Tomcat]会对HTTP请求中的数据进行解析并把解析结果存入到Request对象,可以从Req…

STM32 | STM32时钟分析、GPIO分析、寄存器地址查找、LED灯开发(第二天)

STM32 第二天 一、 STM32时钟分析 寄存器:寄存器的功能是存储二进制代码,它是由具有存储功能的触发器组合起来构成的。一个触发器可以存储1位二进制代码,故存放n位二进制代码的寄存器,需用n个触发器来构成 在计算机领域&#x…

面试经典150题【51-60】

文章目录 面试经典150题【51-60】71.简化路径155.最小栈150.逆波兰表达式求值224.基本计算器141.环形链表2.两数相加21.合并两个有序链表138.随机链表的复制19.删除链表的倒数第N个节点82.删除链表中的重复元素II 面试经典150题【51-60】 71.简化路径 先用split(“/”)分开。然…

HTML极速入门

HTML基础 什么是HTML HTML(Hyper Text Markup Language),超文本标记语言. 超文本:比文本更强大.通过链接和交互式方式来组织和呈现信息的文本形式.不仅仅有文本,还可能包括图片,音频,或者自己经审阅过它的学者所加的评注,补充或脚注等. 标记语言:由标签构成的语言 HTML的标…

【JavaEE进阶】部署Web项目到Linux服务器

文章目录 🍃前言🍀什么是部署🌲环境配置🚩数据准备🚩程序配置⽂件修改 🎄构建项目并打包🎋上传Jar包到服务器,并运行🚩上传Jar包🚩运行程序🚩开放端口号 &…

Material UI 5 学习02-其它按钮组件

Material UI 5 学习02-其它按钮组件 一、IconButton按钮二、 ButtonGroup按钮组1、最基本的实例2、垂直按钮组 一、IconButton按钮 图标按钮通常适用于切换按钮&#xff0c;允许选择或选择单个选项 取消选择&#xff0c;例如在项目中添加或删除星号。 <IconButton aria-lab…

Java多线程卖包子问题(附多种实现方式)

前提条件&#xff1a;生产者生产包子&#xff0c;但是包子总数不得超过10个&#xff0c;消费者有包子就购买 第一种&#xff1a;通过wait()和notify()来实现 在这个实例中&#xff0c;生产者和消费者通过wait()和notify()来进行通讯&#xff0c;再通过synchronized 块来确保线…

Java中文件的相关知识及文件IO操作

在我们日常生活中&#xff0c;会把许多东西都称之为文件。比如&#xff0c;一份纸质报告&#xff0c;或u盘中的一些文档&#xff0c;都会把它们称为文件。那么&#xff0c;这里说的文件是以操作系统的角度出发的。在操作系统中&#xff0c;会把许多硬件设备和软件资源都抽象成“…

【STM32】STM32学习笔记-读写内部FLASH 读取芯片ID(49)

00. 目录 文章目录 00. 目录01. FLASH概述02. 读写内部FLASH接线图03. 读写内部FLASH相关API04. 读写内部FLASH程序示例05. 读写芯片ID接线图06. 读写芯片ID程序示例07. 程序示例下载08. 附录 01. FLASH概述 STM32F10xxx内嵌的闪存存储器可以用于在线编程(ICP)或在程序中编程(…

yolov9训练

目录 说明 1、下载代码安装新的python环境 2、准备数据 3、修改代码 说明 本文参考该博主的文章&#xff0c;在已经有数据的情况&#xff0c;进行简单总结。需要详细版见原文链接如下&#xff1a;YOLOV9保姆级教程-CSDN博客 1、下载代码安装新的python环境 代码下载&…

【数据结构和算法初阶(C语言)】带环链表问题详解(快慢指针的烧脑应用)

目录 1.铺垫-----带环链表基本了解 2. 题目&#xff1a;环形链表 3.环形链表|| ​编辑 3.1题解1 3.2 题解2 4.总结 1.铺垫-----带环链表基本了解 环形链表题目启迪&#xff1a; 环形链表特点&#xff1a;遍历链表会出现一模一样的地址 2. 题目&#xff1a;环形链表 给…

如何使用 ArcGIS Pro 制作三维地形图

伴随硬件性能的提高和软件算法的优化&#xff0c;三维地图的应用场景会越来越多&#xff0c;这里为大家介绍一下在ArcGIS Pro怎么制作三维地形图&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的DEM和影像数据&#xff0c;除了DEM和影像数据…

笨办法学 Python3 第五版(预览)(二)

原文&#xff1a;Learn Python the Hard Way, 5th Edition (Early Release) 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 练习 19&#xff1a;函数和变量 现在你将把函数与你从之前练习中了解到的变量结合起来。如你所知&#xff0c;变量给数据片段一个名称&#x…