【高并发】高速将图片提交到flask、fastapi等主流服务框架

一、摘要

高性能,高并发的读取图片,并将图片传输到服务器的应用场景很多,比如上传图片到网站,将图片提交到后台推理等。这篇文章实现一种多线程并发方式将图片提交到后台。


二、多线程发送请求的实现方法

1. 使用ThreadPoolExecutor线程池

通过线程池管理并发请求,避免手动创建/销毁线程的开销,且支持动态控制并发量。

from concurrent.futures import ThreadPoolExecutor
import requestsdef send_image_to_service(image_path, service_url):"""单张图片的请求发送逻辑"""try:with open(image_path, 'rb') as f:response = requests.post(service_url, files={'image': f})return response.status_codeexcept Exception as e:print(f"请求失败: {image_path}, 错误: {e}")return None# 改造后的多线程发送逻辑
def batch_send_images(image_paths, service_url, max_workers=10):with ThreadPoolExecutor(max_workers=max_workers) as executor:futures = [executor.submit(send_image_to_service, path, service_url)for path in image_paths]# 可选:获取所有请求结果results = [future.result() for future in futures]return results

2. 使用asyncio异步请求(更高性能)

对于高频请求场景(如每秒数百张图片),异步请求能进一步减少I/O等待时间:

import aiohttp
import asyncioasync def async_send_image(session, image_path, service_url):try:with open(image_path, 'rb') as f:async with session.post(service_url, data={'image': f}) as response:return await response.status()except Exception as e:print(f"异步请求失败: {image_path}, 错误: {e}")return Noneasync def async_batch_send(image_paths, service_url, max_concurrent=20):semaphore = asyncio.Semaphore(max_concurrent)  # 限制并发数async with aiohttp.ClientSession() as session:tasks = []for path in image_paths:async with semaphore:task = asyncio.create_task(async_send_image(session, path, service_url))tasks.append(task)return await asyncio.gather(*tasks)

三、集成到原有代码中的示例

# 假设已生成所有图片路径:image_paths = ["frames/frame_0001.jpg", ...]
service_url = "http://your-service.com/upload"# 多线程发送请求(选择以下一种方式)
# 方式1:线程池
batch_send_images(image_paths, service_url, max_workers=10)# 方式2:异步请求(需在异步环境中运行)
asyncio.run(async_batch_send(image_paths, service_url, max_concurrent=20))

四、优化注意事项

  1. 并发数控制
    • 根据服务端承载能力调整max_workersmax_concurrent,避免因过高并发导致服务崩溃。
    • 建议通过压力测试确定最佳值(如从10逐步增加)。

  2. 错误处理与重试
    • 在send_image_to_service函数中增加重试机制(如retrying库)。
    • 记录失败请求的图片路径,便于后续补传。

  3. 性能监控
    • 使用tqdm库显示进度条(参考网页4的优化方法):

    from tqdm import tqdm
    with ThreadPoolExecutor(...) as executor:futures = [executor.submit(...) for path in image_paths]results = []for future in tqdm(futures, desc="发送进度"):results.append(future.result())
    

五、适用场景对比

方法适用场景性能优势
ThreadPoolExecutor简单并发控制,兼容性高中等,适合低频请求
asyncio高频请求(如每秒百次以上)高,资源占用更低

通过以上改造,您可以在不修改视频切片逻辑的前提下,将图片请求的吞吐量提升至原有单线程的10倍以上(具体取决于服务端响应速度)。若需进一步优化,可结合异步IO与连接池技术(如aiohttp的持久化会话)。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【HarmonyOS Next之旅】DevEco Studio使用指南(二)

目录 1 -> 工程模板介绍 2 -> 创建一个新的工程 2.1 -> 创建和配置新工程 2.1.1 -> 创建HarmonyOS工程 2.2.2 -> 创建OpenHarmony工程 1 -> 工程模板介绍 DevEco Studio支持多种品类的应用/元服务开发,预置丰富的工程模板,可以根…

transformer模型介绍——大语言模型 LLMBook 学习(二)

1. transformer模型 1.1 注意力机制 **注意力机制(Attention Mechanism)**在人工智能中的应用,实际上是对人类认知系统中的注意力机制的一种模拟。它主要模仿了人类在处理信息时的选择性注意(Selective Attention)&a…

RAG 常见分块策略全解析:从原理到代码实践(2025 深度版)

大家好,我是大 F,深耕AI算法十余年,互联网大厂技术岗。 知行合一,不写水文,喜欢可关注,分享AI算法干货、技术心得。 更多文章可关注《大模型理论和实战》、《DeepSeek技术解析和实战》,一起探索技术的无限可能! 引言 在检索增强生成(RAG)系统中,分块策略是决定系统…

【论文解读】《START: Self-taught Reasoner with Tools》

链接:https://arxiv.org/pdf/2503.04625 1. 论文概述 解决现有大规模推理模型(LRMs)在复杂推理任务中容易产生幻觉(hallucination)以及内部推理效率低下的问题。提出一种工具集成的长链条思考(Long Chain…

【问题处理】Vmware安装Centos Stream10无法加载安装界面

问题描述 使用Vmware17安装Centos Stream 10,安装界面无法成功加载,长时间显示为灰色,导致安装过程无法继续,如图所示。 问题原因 图形界面的渲染,相比于命令行界面,所需的硬件要求更高。 如果分配的C…

通义万相2.1开源版本地化部署攻略,生成视频再填利器

2025 年 2 月 25 日晚上 11:00 通义万相 2.1 开源发布,前两周太忙没空搞它,这个周末,也来本地化部署一个,体验生成效果如何,总的来说,它在国内文生视频、图生视频的行列处于领先位置&#xff0c…

线程--轻量化进程

1、什么是线程 在⼀个程序⾥的⼀个执⾏路线就叫做线程(thread)。更准确的定义是:线程是“⼀个进程内部的控制序列⼀切进程⾄少都有⼀个执⾏线程线程在进程内部运⾏,本质是在进程地址空间内运⾏在Linux系统中,在CPU眼中…

自动化测试脚本语言选择

测试人员在选择自动化测试脚本语言时面临多种选项。Python、Java、C#、JavaScript 和 Ruby 都是常见选择,但哪种语言最适合?本文将详细分析这些语言的特点、适用场景和优劣势,结合行业趋势和社会现象,为测试人员提供全面指导。 选…

React基础之组件通信

组件嵌套 父子传值实现 实现步骤 1.父组件传递数据-在子组件标签上绑定属性 2.子组件接收数据-子组件通过props参数接收数据 import React, { useRef, useState } from react; //父传子 //1.父组件传递数据,需要在子组件标签上绑定数据 //2.子组件接收数据 props的参…

UE5从入门到精通之如何创建自定义插件

前言 Unreal 的Plugins插件系统中有很多的插件供大家使用,包括官方的和第三方的,这些插件不仅能帮我我们实现特定功能,还能够提升我们的工作效率。 所以我们今天就来自己创建一个自定义插件,如果我们想实现什么特定的功能,我们也可以发布到商店供大家使用了。 创建插件 …

VSCode 2025最新 前端开发必备插件推荐汇总(提效指南)

🌟前言: 如果你是一名前端开发工程师,合适的开发工具能大大提高工作效率。Visual Studio Code (VSCode) 凭借其轻量级、高扩展性的特点,已成为众多前端开发者在win系电脑的首选IDE。 名人说:博观而约取,厚积而薄发。—…

BGP实验(一)IBGP全互联配置

一、拓扑图 二、实验思路 根据BGP的路由优先原则,首先要保证路由可达。但是IBGP间存在水平分割机制,因此实验可使用IBGP全互联,反射器或联盟来实现IBGP间路由可达,本实验使用全互联全互联缺点:将BGP路由引入到IGP&…

查看和杀死进程线程

windows 任务管理器tasklist 查看进程taskkill 杀死进程 liunx ps -fe 查看所有进程ps -fT -p 查看某个进程pid 的所有线程kill 杀死进程kill -9 top 按大写H切换是否现实线程top -H -p 查看某个进程的的所有线程 java jps 查看所有Java进程jstack 查看某个Java进程pid 的所…

SpringBoot(一)--搭建架构5种方法

目录 一、⭐Idea从spring官网下载打开 2021版本idea 1.打开创建项目 2.修改pom.xml文件里的版本号 2017版本idea 二、从spring官网下载再用idea打开 三、Idea从阿里云的官网下载打开 ​编辑 四、Maven项目改造成springboot项目 五、从阿里云官网下载再用idea打开 Spri…

Vue Diff算法原理深度解析:如何高效更新虚拟DOM?

文章目录 1. 为什么需要Diff算法?2. Diff算法核心原则3. 核心流程图解4. 核心代码实现(简化版)5. Key的重要性示例6. 算法优化策略7. 时间复杂度优化8. 与其他框架的对比9. 总结 1. 为什么需要Diff算法? 在Vue的响应式系统中&…

【QT】简易小六壬起卦器 遇事不决 六壬决断

整点有意思的,用qt写了个简易小六壬起卦器。 一天不超过三次,占卜前提 不诚不占, 不疑不占, 不义不占 心血来潮时获取当时起卦结果。 不多说,直接上源码。 #pragma once#include "DADMPCoreExportLib.h" …

数学 二次函数

二次函数 就是计算一个抛物线。 抛物线的基本公式: 重点中的重点就是解决: (开口方向: 对称轴,顶点,交点) 这里的 y 和 x 就是 这个抛物线的个个点的坐标连成的线。 a 的正负 决定和大小决定…

Python匿名函数与面向对象编程核心解析:从lambda到继承多态全掌握

目录 前言一、匿名函数二、面向对象2.1 语言发展2.2 面向对象和面向过程2.2.1 面向过程2.2.2 面向对象2.3 面向对象的技术点二、类的使用三、实例化对象四、访问方法4.1 可以删除、修改、添加类的属性4.2 内置函数访问属性:五、内置类属性六、类的继承6.1 单继承6.2…

Node.js入门笔记2---下载安装Node.js

Node.js入门笔记2 Node.js下载并安装的步骤1.Node.js 环境的安装2. 区分 LTS 版本和 Current 版本的不同3.项目node管理版本工具4.Node.js 包管理工具5.MSI与ZIP文件格式的主要区别6. 选择好上面的内容,点击下载mis7. 环境配置 Node.js下载并安装的步骤 1.Node.js …

【阿里云】控制台使用指南:从创建ECS到系统诊断测评

前言 随着云计算技术的快速发展,越来越多的企业和开发者开始使用云服务来部署和管理应用程序。在众多云服务提供商中,阿里云(Alibaba Cloud)凭借其强大的基础设施和丰富的服务,成为了众多用户的首选。本文旨在介绍如何…