下面是使用golang beego进行优化的代码,将HandelModelData函数封装为SigHandler函数:

package main

import (
	"encoding/json"
	"fmt"
	"github.com/astaxie/beego/logs"
	"net"
	"time"
)

var (
	driverMutex = sync.Mutex{}
	token2driver = make(map[string]chan int)
)

func SigHandler(token string, sig chan int) {
	driverMutex.Lock()
	oldSig, ok := token2driver[token]
	if ok {
		logs.Info("Emmit sig flag, to quit last request")
		oldSig <- 0 // 退出前面的驱动
	}
	token2driver[token] = sig
	driverMutex.Unlock()
}

func HandelModelData(frames [][]int32, coefl float32, token string, commonInfo string, seq int) {
	var finish bool = true
	sig := make(chan int, 1)
	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
}

使用SigHandler函数抽象封装了sig的处理逻辑,可以在函数体内通过调用SigHandler函数来控制数据分发的功能

请使用golang beego 优化下面代码以实现抽象封装sig作为一个函数通过在函数体调用不通过传参来控制数据分发的功能代码如下:func HandelModelDataframes int32 coefl float32 token string commonInfo string seq int 	var finish bool = true	var sig chan int			var o

原文地址: https://www.cveoy.top/t/topic/h9HN 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录