83 lines
2.2 KiB
Go
83 lines
2.2 KiB
Go
package models
|
|
|
|
import "time"
|
|
|
|
type Task struct {
|
|
ID int `json:"id" gorm:"primary_key"`
|
|
Name string `json:"name"`
|
|
Type string `json:"type"` // 任務類型(訓練|推理)
|
|
Status string `json:"status"` // (initial|ready|waiting|running|success|error)
|
|
Progress int `json:"progress"` // (0-100)
|
|
UserID int `json:"user_id"`
|
|
CreatedAt time.Time `json:"created_at" gorm:"autoCreateTime"`
|
|
UpdatedAt time.Time `json:"updated_at" gorm:"autoUpdateTime"`
|
|
}
|
|
|
|
// 异步任务调度管理
|
|
type AsynchronousTaskSchedulingManagement struct {
|
|
tasks map[int]Task // 任务队列
|
|
servers map[string]Server // 服务器队列
|
|
}
|
|
|
|
// 向任务队列添加任务
|
|
func (m *AsynchronousTaskSchedulingManagement) AddTask(task Task) {
|
|
// 1. 任务加入队列, 任务状态为 waiting, 每次从最后一个任务开始执行, 并向上全取同模型的任务, 任务状态更新为 waiting(排队), 并更新此模型的排队状态到所有关注此模型的用户(管理员每个连接都关注所有模型)
|
|
// 2. 任务从队列中取出, 任务队列长度超过12则增加机器, 模型类型持续占用机器则增加机器
|
|
|
|
// 加入任务队列
|
|
m.tasks[task.ID] = task
|
|
|
|
// 检查任务队列长度, 持续增长超过12则增加机器
|
|
if len(m.tasks) > 12 {
|
|
var server Server
|
|
m.servers[server.ID] = server
|
|
}
|
|
|
|
// 向目标机器发送模型
|
|
// 向目标机器切换模型
|
|
// 向目标机器发送任务
|
|
}
|
|
|
|
//// 推理任務
|
|
//func startInferenceTask(task *Task) {
|
|
//
|
|
// // 獲取一臺可用的 GPU 資源
|
|
// // ...
|
|
//
|
|
// // 執行推理任務
|
|
// // ...
|
|
//
|
|
// // 更新任務狀態
|
|
// task.Status = "running"
|
|
// task.Progress = 0
|
|
// task.Update()
|
|
//
|
|
// // 監聽任務狀態
|
|
// for {
|
|
// // 延遲 1 秒
|
|
// time.Sleep(1 * time.Second)
|
|
//
|
|
// // 查詢任務狀態
|
|
// resp, err := http.Get("http://localhost:5000/api/v1/tasks/" + strconv.Itoa(task.ID))
|
|
// if err != nil {
|
|
// log.Println(err)
|
|
// continue
|
|
// }
|
|
// defer resp.Body.Close()
|
|
//
|
|
// // 解析任務狀態
|
|
// // ...
|
|
//
|
|
// // 更新任務狀態
|
|
// task.Progress = 100
|
|
// task.Status = "success"
|
|
// task.Update()
|
|
//
|
|
// // 任務結束判定
|
|
// if task.Progress == 100 {
|
|
// break
|
|
// }
|
|
// }
|
|
//
|
|
//}
|