Golang map 全局变量使用问题,请各位大佬留步一观。

各位大佬大家好,还是小弟我,这次开发遇到了一个挺坑的问题
首先说一下需求,我要完成一个任务的开始停止,对,就是这么简单。
小弟首先定义了一个全局的 map 变量去存储 job 的信息

//SyncJob 任务详情
type SyncJob struct {
	ID     string
	Ctx    context.Context
	Cancel context.CancelFunc
}

//Job 单个同步任务
var Job = make(map[string]interface{})

//JobWork job 列表
var JobWork = make(map[string][]map[string]interface{})

然后我定义了一个 startwork 和 stopwork,

//SyncStart 任务开始
func SyncStart(id string) (msg string, err error) {
	var job SyncJob
	ctx, cancel := context.WithCancel(context.Background())
    go do work(id)
	job.ID = id
	job.Ctx = ctx
	job.Cancel = cancel
	Job[id] = job
	JobWork[\"job\"] = append(JobWork[\"job\"], Job)
	return \"Start work success\", nil
}
//SyncStop 任务结束
func SyncStop(id string) (msg string, err error) {
	for _, i := range JobWork[\"job\"] {
		jobss := i[id]
		op, _ := jobss.(SyncJob)
		defer op.Cancel()
	}
	return \"Stop work success\", nil
}

我尝试了一下这种写法

infiapi.SyncStart(\"123456\")
time.Sleep(time.Second * 10)
infiapi.SyncStop(\"123456\")

这样是可以停止任务的。
但是!小弟写了一个 web server, 想在 web server 中停止它

func StartSyncwork(w http.ResponseWriter, r *http.Request) {
	r.ParseForm()       //解析参数,默认是不会解析的
	fmt.Println(r.Form) //这些信息是输出到服务器端的打印信息
	id := r.Form[\"uid\"]
	infiapi.SyncStart(string(id[0]))
}

func StopSyncWork(w http.ResponseWriter, r *http.Request) {
	r.ParseForm()       //解析参数,默认是不会解析的
	fmt.Println(r.Form) //这些信息是输出到服务器端的打印信息
	id := r.Form[\"uid\"]
	infiapi.SyncStop(string(id[0]))
}
........
http.HandleFunc(\"/start\", StartSyncwork) //设置访问的路由
http.HandleFunc(\"/stop\", StopSyncWork)

这样调用开启可以,但是 stop 无法停止,是 map 作用域的问题么?这样该如何解决呢??拜谢!

相关文章

11 thoughts on “Golang map 全局变量使用问题,请各位大佬留步一观。

  1. 首先记得加个锁… 不然会有竞争读写问题
    可以用`sync.Map`

    和作用域无关。
    `SyncStop`为什么要用`defer`呢 直接`op.Cancel()` 就可以了
    另外你这个多层套娃看的有点晕啊。。。搞个 repo 可以帮你看下

  2. 1 、for 里面不要 defer, 会有泄露问题
    2 、任务调度器一般不这样做的。起一个调度 goroutine 作为调度器,任务队列 chan,每个任务 go 一个协程来执行,并且创建一个 stopChan 来等待 stop 事件停止任务。然后通过 chan 或者队列的方式来投递任务和监听 chan 来消费任务。接口 start 创建任务和扔进 chan 。stop 接口发送 stop 事件到对应 stopChan,达到停止任务的目的

发表评论

电子邮件地址不会被公开。 必填项已用*标注