1.实现了基于Gin框架的RESTful API服务,用于接收和管理AI任务
2.设计了任务队列系统,支持任务的创建、查询和状态更新
3.提供了后台任务执行器,能够并发处理多种类型的AI任务
4.支持任务状态跟踪,包括待处理、运行中、完成和失败状态
5.使用UUID生成唯一任务ID,确保任务标识的唯一性
6.集成了现代化的Web框架Gin,提供高性能的HTTP服务
7.通过goroutine实现异步任务处理,提高系统并发能力
8.提供了完整的任务生命周期管理,包括创建时间、开始时间和完成时间记录
go
//main.go
package main
import (
"context"
"encoding/json"
"fmt"
"log"
"net/http"
"time"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
)
type TaskStatus string
const (
TaskPending TaskStatus = "pending"
TaskRunning TaskStatus = "running"
TaskCompleted TaskStatus = "completed"
TaskFailed TaskStatus = "failed"
)
type Task struct {
ID string `json:"id"`
Type string `json:"type"`
Status TaskStatus `json:"status"`
Payload string `json:"payload"`
Result string `json:"result"`
CreatedAt time.Time `json:"created_at"`
StartedAt *time.Time `json:"started_at,omitempty"`
CompletedAt *time.Time `json:"completed_at,omitempty"`
}
type TaskQueue struct {
tasks map[string]*Task
}
func NewTaskQueue() *TaskQueue {
return &TaskQueue{
tasks: make(map[string]*Task),
}
}
func (tq *TaskQueue) AddTask(taskType, payload string) *Task {
task := &Task{
ID: uuid.New().String(),
Type: taskType,
Status: TaskPending,
Payload: payload,
CreatedAt: time.Now(),
}
tq.tasks[task.ID] = task
return task
}
func (tq *TaskQueue) GetTask(id string) *Task {
return tq.tasks[id]
}
func (tq *TaskQueue) GetAllTasks() []*Task {
tasks := make([]*Task, 0, len(tq.tasks))
for _, task := range tq.tasks {
tasks = append(tasks, task)
}
return tasks
}
func (tq *TaskQueue) UpdateTaskStatus(id string, status TaskStatus, result string) {
if task, exists := tq.tasks[id]; exists {
task.Status = status
if status == TaskRunning {
now := time.Now()
task.StartedAt = &now
}
if status == TaskCompleted || status == TaskFailed {
now := time.Now()
task.CompletedAt = &now
task.Result = result
}
}
}
type TaskExecutor struct {
taskQueue *TaskQueue
}
func NewTaskExecutor(taskQueue *TaskQueue) *TaskExecutor {
return &TaskExecutor{
taskQueue: taskQueue,
}
}
func (te *TaskExecutor) ExecuteTask(ctx context.Context, task *Task) {
// 模拟任务处理
te.taskQueue.UpdateTaskStatus(task.ID, TaskRunning, "")
// 模拟不同类型的AI任务
switch task.Type {
case "image_classification":
// 模拟图像分类任务
time.Sleep(2 * time.Second)
te.taskQueue.UpdateTaskStatus(task.ID, TaskCompleted, "分类结果: 猫科动物 (置信度: 95%)")
case "text_generation":
// 模拟文本生成任务
time.Sleep(3 * time.Second)
te.taskQueue.UpdateTaskStatus(task.ID, TaskCompleted, "生成文本: 基于输入内容的AI生成文本示例...")
case "data_analysis":
// 模拟数据分析任务
time.Sleep(1 * time.Second)
te.taskQueue.UpdateTaskStatus(task.ID, TaskCompleted, "分析结果: 数据趋势正常,异常值检测完成")
default:
te.taskQueue.UpdateTaskStatus(task.ID, TaskFailed, "未知任务类型")
}
}
func main() {
taskQueue := NewTaskQueue()
taskExecutor := NewTaskExecutor(taskQueue)
// 启动后台任务处理协程
go func() {
for {
for _, task := range taskQueue.GetAllTasks() {
if task.Status == TaskPending {
go taskExecutor.ExecuteTask(context.Background(), task)
}
}
time.Sleep(100 * time.Millisecond)
}
}()
// 初始化Gin路由器
r := gin.Default()
// 创建任务端点
r.POST("/tasks", func(c *gin.Context) {
var req struct {
Type string `json:"type" binding:"required"`
Payload string `json:"payload"`
}
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
task := taskQueue.AddTask(req.Type, req.Payload)
c.JSON(http.StatusCreated, task)
})
// 获取任务状态端点
r.GET("/tasks/:id", func(c *gin.Context) {
id := c.Param("id")
task := taskQueue.GetTask(id)
if task == nil {
c.JSON(http.StatusNotFound, gin.H{"error": "任务未找到"})
return
}
c.JSON(http.StatusOK, task)
})
// 获取所有任务端点
r.GET("/tasks", func(c *gin.Context) {
tasks := taskQueue.GetAllTasks()
c.JSON(http.StatusOK, tasks)
})
// 启动服务器
fmt.Println("AI任务执行器启动成功,监听端口: 8080")
log.Fatal(r.Run(":8080"))
}
go
//go.mod
module ai-task-executor
go 1.19
require (
github.com/gin-gonic/gin v1.9.1
github.com/google/uuid v1.3.0
)
require (
github.com/bytedance/sonic v1.10.0 // indirect
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/go-playground/validator/v10 v10.14.0 // indirect
github.com/goccy/go-json v0.10.2 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/cpuid/v2 v2.2.5 // indirect
github.com/leodido/go-urn v1.2.4 // indirect
github.com/mattn/go-isatty v0.0.19 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pelletier/go-toml/v2 v2.1.0 // indirect
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/ugorji/go/codec v1.2.11 // indirect
golang.org/x/arch v0.4.0 // indirect
golang.org/x/crypto v0.9.0 // indirect
golang.org/x/net v0.10.0 // indirect
golang.org/x/sys v0.8.0 // indirect
golang.org/x/text v0.9.0 // indirect
google.golang.org/protobuf v1.30.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)