各位大佬大家好,还是小弟我,这次开发遇到了一个挺坑的问题
首先说一下需求,我要完成一个任务的开始停止,对,就是这么简单。
小弟首先定义了一个全局的 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 作用域的问题么?这样该如何解决呢??拜谢!
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.