请使用golang beego 优化下面代码以实现抽象出sig来控制数据分发的功能代码如下:func HandelModelDataframes int32 coefl float32 token string commonInfo string seq int var finish bool = true var sig chan int var ok bool driverMutexL
要实现抽象出sig来控制数据分发的功能,可以将sig chan int作为函数参数传入,并在函数中使用这个sig chan int来进行控制。以下是优化后的代码:
func HandelModelData(frames [][]int32, coefl float32, token string, commonInfo string, seq int, sig chan int) {
var finish bool = true
{
var ok bool
driverMutex.Lock()
sig, ok = token2driver[token]
if !ok {
sig = make(chan int, 1)
token2driver[token] = sig
} else {
logs.Info("%s, emmit sig flag, to quit last request", commonInfo)
sig <- 0 // 退出前面的驱动
}
driverMutex.Unlock()
}
defer func() {
if finish {
driverMutex.Lock()
_, ok := token2driver[token]
if ok {
close(sig)
delete(token2driver, token)
}
driverMutex.Unlock()
logs.Info("%s, finish", commonInfo)
}
}()
api := appconf.StreamInfoApi + "?token=" + token
status, stream := util.OnGetHttpTimeout(api, 10)
if status != 200 {
logs.Error("%s, api = %v, status = %d, result = %s", commonInfo, api, status, string(stream))
return
}
var streamInfoRes protocol.StreamInfoRes
err := json.Unmarshal(stream, &streamInfoRes)
if err != nil {
logs.Error("%s, err = %v", commonInfo, err)
return
}
if streamInfoRes.Code != 200 {
logs.Error("%s HandelModelData, err = %v", commonInfo, streamInfoRes)
}
sip := streamInfoRes.Data.Ip
sport := 11111
if sip == "" {
logs.Error("%s, invalid ip", commonInfo)
return
}
socket, err := net.DialUDP("udp", nil, &net.UDPAddr{
IP: net.ParseIP(sip),
Port: sport,
})
if err != nil {
logs.Error("%s, ip = %s, port = %d, err = %v", commonInfo, sip, sport, err)
return
}
defer socket.Close()
_ = StartBSDriver(token, seq)
logs.Info("%s, sip = %s, sport = %d", commonInfo, sip, sport)
{
startReq := make(map[string]interface{})
startReq["userIp"] = sip
startData, _ := json.Marshal(&startReq)
var nsent = 0
for nsent < len(startData) {
n, err := socket.Write(startData[nsent:])
if err != nil {
logs.Error("%s, ip = %s, port = %d, err = %v", commonInfo, sip, sport, err)
}
nsent += n
}
logs.Info("%s, ip = %s, port = %d, OnAudioDriver", commonInfo, sip, sport)
}
logs.Info("frames: %v, coefl: %v", frames[0], coefl)
Loop:
for i := 0; i < len(frames); i++ {
frame := make([]float32, 61)
for j := 0; j < 51; j++ {
frame[j] = float32(frames[i][j]) / coefl
}
select {
case <-sig:
logs.Info("%s, recv quit sig, quit now", commonInfo)
finish = false
break Loop
default:
data := MakeBSFrame(frame)
var nsent = 0
for nsent < len(data) {
n, err := socket.Write(data[nsent:])
if err != nil {
fmt.Println("send, err =", err)
}
nsent += n
}
time.Sleep(15 * time.Millisecond)
}
}
_ = StopBSDriver(token, seq)
return
}
在优化后的代码中,将之前局部变量的sig chan int改为函数参数的sig chan int,并在函数调用处传入一个sig chan int,以控制数据分发
原文地址: http://www.cveoy.top/t/topic/h9Hu 著作权归作者所有。请勿转载和采集!