package main
|
|
import (
|
"analysis/logo"
|
"analysis/util"
|
"fmt"
|
"os/exec"
|
"os/signal"
|
"runtime/debug"
|
"strconv"
|
"syscall"
|
"time"
|
|
"analysis/app/master"
|
"analysis/app/slave"
|
|
"context"
|
"flag"
|
|
"os"
|
// "net/http"
|
// _ "net/http/pprof"
|
)
|
|
var (
|
logit bool
|
role string
|
runType string
|
id string
|
gpu int
|
shm bool
|
ruleIPC string
|
|
configPath string
|
)
|
|
const (
|
roleMaster = `master`
|
roleSlave = `slave`
|
)
|
|
func init() {
|
flag.StringVar(&role, "role", roleMaster, "进程启动方式,master/slave")
|
flag.StringVar(&runType, "sdk", util.FeatAll, "进程运行的算法类型FaceDetect/Yolo,etc.slave使用")
|
flag.StringVar(&id, "id", util.FakeSdkID, "进程运行算法的ID,slave使用")
|
|
flag.StringVar(&configPath, util.ConfigPath, "", "进程运行算法的参数配置文件路径,master从路径读取文件,slave使用文件")
|
|
flag.BoolVar(&logit, util.LogIt, false, "是否保存日志文件,默认false")
|
flag.BoolVar(&shm, util.SHM, false, "是否使用shared memory, 默认false, slave使用")
|
|
flag.IntVar(&gpu, util.GPU, -1, "进程运行算法需要的GPU Index")
|
|
// 指定获取配置信息从sqlite,有最高优先级, master使用
|
flag.StringVar(&util.FSI.IP, util.FetchSrvIP, util.FSI.IP, "从IP获取需要运行的SDK,master使用")
|
flag.IntVar(&util.FSI.HTTPort, util.FetchSrvPort, util.FSI.HTTPort, "获取需要运行的SDK服务器的HTTP Port,master使用")
|
flag.IntVar(&util.FSI.HBPort, util.FetchSrvHeartbeatPort, util.FSI.HBPort, "获取需要运行的SDK服务器的心跳 Port,master使用")
|
flag.IntVar(&util.FSI.DataPort, util.FetchSrvDataPort, util.FSI.DataPort, "获取需要运行的SDK服务器的数据 Port,master使用")
|
|
// 指定发送到ruleprocess的ipc地址
|
flag.StringVar(&util.ToRuleIPC, util.RuleIPC, util.ToRuleIPC, "将算法运行结果发送到规则服务器的IPC地址,slave使用")
|
}
|
|
func runLogger() {
|
|
suffix := role + "_" + runType
|
|
if logit {
|
file := util.LogFile + suffix // + strconv.Itoa(os.Getpid())
|
logo.Config(file, 500, 3, 30)
|
logo.Infoln("START LOGGER FILE: ", file)
|
}
|
logo.ShowConsole()
|
}
|
|
func setParamters() {
|
util.FillParams(util.FetchSrvIP, util.FSI.IP)
|
util.FillParams(util.FetchSrvPort, strconv.Itoa(util.FSI.HTTPort))
|
util.FillParams(util.FetchSrvHeartbeatPort, strconv.Itoa(util.FSI.HBPort))
|
util.FillParams(util.FetchSrvDataPort, strconv.Itoa(util.FSI.DataPort))
|
|
util.FillParams(util.RuleIPC, util.ToRuleIPC)
|
|
util.FillParams(util.GPU, strconv.Itoa(gpu))
|
if logit {
|
util.FillParams(util.LogIt, "true")
|
}
|
if shm {
|
util.FillParams(util.SHM, "true")
|
}
|
}
|
|
func main() {
|
|
util.InitConfig()
|
|
flag.Parse()
|
|
// go func() {
|
// http.ListenAndServe("0.0.0.0:6060", nil)
|
// }()
|
|
runLogger()
|
|
if configPath == "" || len(configPath) == 0 {
|
logo.Infoln("!!!!!! SDK CONFIG PATH MUST EXIST !!!!!!")
|
return
|
}
|
logo.Infoln(os.Args)
|
ctx, cancel := context.WithCancel(context.Background())
|
|
ret := false
|
if role == roleMaster {
|
defer dump(util.LogFile + "_dump_" + time.Now().Format("20060102150405"))
|
setParamters()
|
ret = master.Run(ctx, "./libcomm.so", configPath)
|
|
} else if role == roleSlave {
|
ret = slave.Run(ctx, configPath, runType, id, gpu, shm)
|
} else if role == "test" {
|
ret = slave.TwoPluginConflict("./libcomm.so", "./zconf/Yolo.json")
|
}
|
|
if ret {
|
c := make(chan os.Signal, 1)
|
signal.Notify(c, os.Interrupt, os.Kill, syscall.SIGTERM)
|
<-c
|
}
|
|
cancel()
|
|
logo.Close()
|
}
|
|
// const (
|
// configFilePath = "/opt/vasystem/config/"
|
// configFileName = "sdkconfig"
|
// configFileType = "yaml"
|
// )
|
// viper.SetConfigType(configFileType)
|
// viper.SetConfigName(configFileName)
|
// viper.AddConfigPath(configFilePath)
|
// viper.AddConfigPath("./")
|
|
// envString := ""
|
|
func dump(dumpFile string) {
|
dumpErr := recover()
|
if dumpErr == nil {
|
return
|
}
|
f, err := os.Create(dumpFile)
|
if err != nil {
|
return
|
}
|
f.WriteString(fmt.Sprintf("panic:\r\n%v", dumpErr))
|
f.WriteString("\r\n\nstack:\r\n")
|
f.WriteString(string(debug.Stack()))
|
f.Close()
|
|
//////////////////////////////////////////////
|
// restart master
|
|
cmd := exec.Command(os.Args[0], os.Args[1:]...)
|
cmd.Stdout = os.Stdout
|
cmd.Stderr = os.Stderr
|
cmd.Start()
|
}
|