Golang Beego 代码优化:使用 SigHandler 函数抽象封装数据分发逻辑
{
"title": "Golang Beego 代码优化:使用 SigHandler 函数抽象封装数据分发逻辑",
"description": "本文介绍如何使用 Golang Beego 优化代码,将数据分发逻辑抽象封装为 SigHandler 函数,并通过函数调用控制数据分发功能。",
"keywords": "Golang, Beego, 代码优化, 数据分发, 抽象封装, SigHandler",
"content": "下面是使用golang beego进行优化的代码,将HandelModelData函数封装为SigHandler函数:\n\ngo\npackage main\n\nimport (\n\t"encoding/json"\n\t"fmt"\n\t"github.com/astaxie/beego/logs"\n\t"net"\n\t"time"\n)\n\nvar (\n\tdriverMutex = sync.Mutex{}\n\ttoken2driver = make(map[string]chan int)\n)\n\nfunc SigHandler(token string, sig chan int) {\n\tdriverMutex.Lock()\n\toldSig, ok := token2driver[token]\n\tif ok {\n\t\tlogs.Info("Emmit sig flag, to quit last request")\n\t\toldSig <- 0 // 退出前面的驱动\n\t}\n\ttoken2driver[token] = sig\n\tdriverMutex.Unlock()\n}\n\nfunc HandelModelData(frames [][]int32, coefl float32, token string, commonInfo string, seq int) {\n\tvar finish bool = true\n\tsig := make(chan int, 1)\n\tdefer func() {\n\t\tif finish {\n\t\t\tdriverMutex.Lock()\n\t\t\t_, ok := token2driver[token]\n\t\t\tif ok {\n\t\t\t\tclose(sig)\n\t\t\t\tdelete(token2driver, token)\n\t\t\t}\n\t\t\tdriverMutex.Unlock()\n\t\t\tlogs.Info("%s, finish", commonInfo)\n\t\t}\n\t}()\n\n\tapi := appconf.StreamInfoApi + "?token=" + token\n\tstatus, stream := util.OnGetHttpTimeout(api, 10)\n\tif status != 200 {\n\t\tlogs.Error("%s, api = %v, status = %d, result = %s", commonInfo, api, status, string(stream))\n\t\treturn\n\t}\n\tvar streamInfoRes protocol.StreamInfoRes\n\terr := json.Unmarshal(stream, &streamInfoRes)\n\tif err != nil {\n\t\tlogs.Error("%s, err = %v", commonInfo, err)\n\t\treturn\n\t}\n\tif streamInfoRes.Code != 200 {\n\t\tlogs.Error("%s HandelModelData, err = %v", commonInfo, streamInfoRes)\n\t}\n\tsip := streamInfoRes.Data.Ip\n\tsport := 11111\n\tif sip == "" {\n\t\tlogs.Error("%s, invalid ip", commonInfo)\n\t\treturn\n\t}\n\tsocket, err := net.DialUDP("udp", nil, &net.UDPAddr{\n\t\tIP: net.ParseIP(sip),\n\t\tPort: sport,\n\t})\n\tif err != nil {\n\t\tlogs.Error("%s, ip = %s, port = %d, err = %v", commonInfo, sip, sport, err)\n\t\treturn\n\t}\n\tdefer socket.Close()\n\n\t_ = StartBSDriver(token, seq)\n\n\tlogs.Info("%s, sip = %s, sport = %d", commonInfo, sip, sport)\n\n\t{\n\t\tstartReq := make(map[string]interface{})\n\t\tstartReq["userIp"] = sip\n\t\tstartData, _ := json.Marshal(&startReq)\n\t\tvar nsent = 0\n\t\tfor nsent < len(startData) {\n\t\t\tn, err := socket.Write(startData[nsent:])\n\t\t\tif err != nil {\n\t\t\t\tlogs.Error("%s, ip = %s, port = %d, err = %v", commonInfo, sip, sport, err)\n\t\t\t}\n\t\t\tnsent += n\n\t\t}\n\t\tlogs.Info("%s, ip = %s, port = %d, OnAudioDriver", commonInfo, sip, sport)\n\t}\n\tlogs.Info("frames: %v, coefl: %v", frames[0], coefl)\n\nLoop:\n\tfor i := 0; i < len(frames); i++ {\n\t\tframe := make([]float32, 61)\n\t\tfor j := 0; j < 51; j++ {\n\t\t\tframe[j] = float32(frames[i][j]) / coefl\n\t\t}\n\t\tselect {\n\t\tcase <-sig:\n\t\t\tlogs.Info("%s, recv quit sig, quit now", commonInfo)\n\t\t\tfinish = false\n\t\t\tbreak Loop\n\t\tdefault:\n\t\t\tdata := MakeBSFrame(frame)\n\t\t\tvar nsent = 0\n\t\t\tfor nsent < len(data) {\n\t\t\t\tn, err := socket.Write(data[nsent:])\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Println("send, err =", err)\n\t\t\t\t}\n\t\t\t\tnsent += n\n\t\t\t}\n\t\t\ttime.Sleep(15 * time.Millisecond)\n\t\t}\n\t}\n\t_ = StopBSDriver(token, seq)\n\treturn\n}\n\n\n使用SigHandler函数抽象封装了sig的处理逻辑,可以在函数体内通过调用SigHandler函数来控制数据分发的功能。
原文地址: https://www.cveoy.top/t/topic/pStZ 著作权归作者所有。请勿转载和采集!