gin接收图片文件,websocet持续返回响应,解决多任务排队问题

背景

有一个需求是这样的,前端需要通过http请求的form-data上传图片文件,后端接收图片后调用AI接口执行命令,由于命令执行时间较长,需要持续返回当前任务在全局任务列表中的位置,以便前端即时更新排队信息。

思考

如果直接在gin的请求处理函数中开goroutine,并在goroutine中通过类似c.JSON的方法来返回响应,前端会无法收到响应。原因是当处理函数返回时,Gin 会自动关闭 HTTP 请求的响应,这意味着在处理函数返回后,后台的协程无法再向响应中写入数据,从而导致客户端收不到信息。(不用goroutine也不行,因为持续返回响应涉及到使用for循环,会阻塞通道,阻塞主协程,仍然无法返回响应),使用gin配合websocket解决。

于是解决方案就是,使用gin的处理函数接收图片后,把当前任务的id作为响应返回给前端。然后前端再用当前任务的id建立websocket请求,在websocket请求中,通常不会自动关闭,除非显式地由客户端或服务器关闭,所以就可以在ws的处理函数中开goroutine来持续返回响应。

func WsHandleConnect(s *melody.Session) {TaskId, _ := s.Get("task_id")// 将 TaskId 转换为字符串并解析为整数taskIdStr, _ := TaskId.(string)taskId, err := strconv.Atoi(taskIdStr)if err != nil {sendJSONResponse(s, Res{Code: 4000,Msg:  "Invalid Task ID",Data: nil,})s.Close()return}var task *model.Task// 遍历 TaskQueue 查找对应的任务for _, t := range global.TaskQueue {if t.ID == taskId {task = tbreak}}if task == nil {sendJSONResponse(s, Res{Code: 4000,Msg:  "Task ID not provided",Data: nil,})s.Close()return}logger.Log.Error("task:", task.ID)go func() {for {select {case result := <-task.Response:sendJSONResponse(s, Res{Code: global.SuccessCode,Msg:  result,Data: nil,})s.Close()returndefault:time.Sleep(3 * time.Second)if len(global.TaskQueue) == 0 {sendJSONResponse(s, Res{Code: global.SuccessCode,Msg:  "Task failed",Data: nil,})s.Close()return}position := service.FindTaskPosition(task.ID)sendJSONResponse(s, Res{Code: global.SuccessCode,Data: position,})}}}()
}

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

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

相关文章

【源码】Spring Data JPA原理解析之Repository自定义方法命名规则执行原理(二)

Spring Data JPA系列 1、SpringBoot集成JPA及基本使用 2、Spring Data JPA Criteria查询、部分字段查询 3、Spring Data JPA数据批量插入、批量更新真的用对了吗 4、Spring Data JPA的一对一、LazyInitializationException异常、一对多、多对多操作 5、Spring Data JPA自定…

Oracle中TAF与SCANIP全面解析

TAF (Transparent Application Failover) 概念&#xff1a; TAF是Oracle数据库提供的一个高级特性&#xff0c;旨在实现应用程序在数据库连接中断时的透明重连。它允许应用程序在数据库故障发生时&#xff0c;无需修改代码或手动干预&#xff0c;就能自动连接到新的数据库实例…

Java垃圾回收_1

一、垃圾回收 1.如何判断对象可以回收 &#xff08;1&#xff09;引用计数法 存在循环引用问题&#xff0c; Java未使用这种算法 在引用计数法中&#xff0c;每个对象都有一个引用计数器&#xff0c;记录着指向该对象的引用数量。当引用计数器为零时&#xff0c;表示没有任…

JavaSE:SE知识整体总结

1、引言 历时一个多月的学习&#xff0c;已经掌握了JavaSE的知识&#xff0c;这篇博客就来做一下SE知识的总结~ 2、数据类型和变量 Java中的数据类型分为基本数据类型和引用数据类型。 2.1 基本数据类型 基本数据类型共有四类八种&#xff1a; 四类&#xff1a;整形、浮点…

在phpstorm2024版里如何使用Jetbrains ai assistant 插件 ?

ai assistant激活成功后&#xff0c;如图 ai assistant渠道&#xff1a;https://web.52shizhan.cn/activity/ai-assistant 在去年五月份的 Google I/O 2023 上&#xff0c;Google 为 Android Studio 推出了 Studio Bot 功能&#xff0c;使用了谷歌编码基础模型 Codey,Codey 是…

SpringBoot HelloWorld 之 实现注册功能

SpringBoot HelloWorld 之 实现注册功能 一.配置 创建数据库big_event CREATE TABLE user (id int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT ID,username varchar(20) COLLATE utf8_unicode_ci NOT NULL COMMENT 用户名,password varchar(32) COLLATE utf8_unicode_ci …

Vue3项目练习详细步骤(第五部分:用户模块的功能)

顶部导航栏个人信息显示 接口文档 接口请求与绑定 导航栏下拉菜单功能 路由实现 退出登录和路由跳转实现 基本资料修改 页面结构 接口文档 接口请求与绑定 修改头像 页面结构 头像回显 头像上传 接口文档 重置密码 页面结构 接口文档 接口请求与绑定 顶部导航…

自然语言处理学习路线

学习目标 NLP 系统知识&#xff08;从入门到入土&#xff09; 学习内容 NLP的基本流程&#xff1a;&#xff08;待更&#xff09;文本预处理&#xff08;标点符号处理、繁体转简体、分词Tokenizer&#xff09;&#xff1a;&#xff08;待更&#xff09;词袋模型&#xff08;TF…

【T+】畅捷通T+软件固定资产模块反启用

【问题描述】 畅捷通T软件&#xff0c;固定资产模块反启用。 【解决方法】 针对账套库执行如下脚本清除资产的所有数据&#xff0c; 执行前请与客户确认资产的所有数据都不要了&#xff0c;确认后备份账套再执行脚本&#xff0c;切记&#xff01;&#xff01;&#xff01; 然后…

Flutter 中的 ChipTheme 小部件:全面指南

Flutter 中的 ChipTheme 小部件&#xff1a;全面指南 Flutter 是一个由 Google 开发的跨平台 UI 框架&#xff0c;它提供了一套丰富的组件集合&#xff0c;用于构建现代化的、响应式的移动和 Web 应用。ChipTheme 是 Flutter 中一个专门用于统一设置应用中所有 Chip 组件样式的…

红外热成像观驱一体仪,夜间驱鸟新利器

夜间驱鸟是机场鸟防工作的重点和难点&#xff0c;但红外热成像观驱一体仪的出现解决了这个问题&#xff0c;它结合了红外热成像技术和激光驱鸟技术&#xff0c;极大地提升了夜间驱鸟工作的效率和安全性。 驱鸟技术详解&#xff1a; 在夜晚低能见度的环境下&#xff0c;红外热成…

基于开源项目ESP32 SVPWM驱动无刷电机开环速度测试

基于开源项目ESP32 SVPWM驱动无刷电机开环速度测试 ✨本篇硬件电路和代码来源于此开源项目&#xff1a;https://github.com/MengYang-x/STM3F401-FOC/tree/main&#x1f4cd;硬件电路和项目介绍&#xff0c;立创开源广场&#xff1a;https://oshwhub.com/shadow27/tai-yang-nen…

【bug】在 Windows 上安装 SDKMAN! 的完整指南

在 Windows 系统上&#xff0c;安装 SDKMAN! 可能会遇到一些小问题。本文将详细介绍如何解决这些问题并成功安装 SDKMAN!。 问题描述 当在 PowerShell 中运行以下命令以安装 SDKMAN! 时&#xff1a; curl -s get.sdkman.io | bash你可能会遇到以下错误&#xff1a; bash : …

前端面试题日常练-day45 【面试题】

题目 希望这些选择题能够帮助您进行前端面试的准备&#xff0c;答案在文末 1. 在Bootstrap中&#xff0c;以下哪个类用于创建一个具有响应式的导航栏&#xff1f; a) .navbar-responsive b) .responsive-nav c) .navbar-collapse d) .collapse-navbar 2. 哪个Bootstrap类用…

2024 HN CTF WebMisc 部分 wp

Web ez_tp 判断是thinkphp 3.2 参考官方手册:https://www.kancloud.cn/manual/thinkphp/1697 判断路由模式 URL_CASE_INSENSITIVE > true, // 默认false 表示URL区分大小写 true则表示不区分大小写URL_MODEL > 1, // URL访问模式,可选参数0、1、…

Python使用动态代理的多元应用

Python作为一种功能强大且易于学习的编程语言&#xff0c;在网络编程领域具有广泛的应用。当Python与动态代理技术结合时&#xff0c;便开启了一扇通往更多可能性的大门。以下将深入探讨Python使用动态代理可以实现的多种应用。 首先&#xff0c;Python结合动态代理在网络爬虫…

中文多模态InternVL-Chat-V1-5,中文理解能力强劲,8 项指标超越商业模型,性能媲美 GPT-4V

前言 近年来&#xff0c;多模态大型语言模型&#xff08;MLLM&#xff09;的快速发展&#xff0c;为人工智能在图像、文本等多模态信息理解和处理方面带来了前所未有的突破。然而&#xff0c;现有的主流多模态模型多以英文为训练语言&#xff0c;在中文理解和处理方面存在着明…

可用于嵌入式的解释器调研对比,及lua解释器介绍

嵌入式不一定只能用C! ---------------------------------------------------------------------------------------手动分割线-------------------------------------------------------------------------------- 本文章参考了以下文章&#xff1a; 这里是引用 ------------…

1113 钱串子的加法

idea 测试点3&#xff1a;输入的两个整数都是0测试点4.5&#xff1a;大数&#xff0c;需要用大数加法 solution1(测试点4&#xff0c;5不通过) 直接相加再转30进制 #include<iostream> #include<string> using namespace std; typedef long long ll; string a,…

linux sed命令替换文件端口

1、需求描述&#xff1a;因sed -i ‘s/旧端口/新端口/g’ 文件&#xff0c;替换会直接增加端口导致端口直接追加后面&#xff0c;因此需要修改 要求&#xff1a;2300替换为23003&#xff0c;23001替换为23004 <value>192.168.1.133</value></constructor-arg>…