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 = t
			break
		}
	}
	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()
				return
			default:
				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,
				})

			}
		}
	}()
}

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-06-06 11:44:13       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-06 11:44:13       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-06 11:44:13       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-06 11:44:13       18 阅读

热门阅读

  1. WPF 委托

    2024-06-06 11:44:13       8 阅读
  2. Gin入门

    Gin入门

    2024-06-06 11:44:13      9 阅读
  3. ffmpeg常用命令

    2024-06-06 11:44:13       7 阅读
  4. Yolov10环境配置+训练自己数据集(Windows10)

    2024-06-06 11:44:13       8 阅读
  5. Life perception 4

    2024-06-06 11:44:13       7 阅读
  6. python 编写登录界面

    2024-06-06 11:44:13       7 阅读
  7. pandas不要存储excel

    2024-06-06 11:44:13       8 阅读
  8. 深度学习中域适应的简要概述

    2024-06-06 11:44:13       7 阅读
  9. css实现不同设备适配

    2024-06-06 11:44:13       6 阅读