您好,登錄后才能下訂單哦!
本篇內容主要講解“golang使用context關閉go routine的方法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“golang使用context關閉go routine的方法”吧!
go語言提供了context包,支持在多個go routine之間傳遞信號,可以使用它優雅的取消任務,從而優雅的結束go routine,節約系統資源。
今天遇到了這個任務,有多科考試,需要比對一下各個學科的考試學生名單是否一致,考慮到假如有好幾科,然后每科有幾千個學生,如果只用循環那么需要循環幾萬次,于是就開了協程結合context進行處理。話不多說,直接上代碼:
var baseStus []examstudent.StudentViewModel linq.From(stuMap[int(sexams[0].SeID)]).OrderBy(func(i interface{}) interface{} { return i.(examstudent.StudentViewModel).ExamCode }).ToSlice(&baseStus) //定義一個支持取消的context ctx, cancel := context.WithCancel(context.Background()) //標志,用來區分是一致還是不一致 sch := make(chan int, len(sexams)-1) for i, _ := range sexams { if i == 0 { continue } //開啟協程 go func(c context.Context, index int) { var compareStus []examstudent.StudentViewModel linq.From(stuMap[int(sexams[i].SeID)]).OrderBy(func(x interface{}) interface{} { return x.(examstudent.StudentViewModel).ExamCode }).ToSlice(&compareStus) for x, vv := range baseStus { select { case <-c.Done(): return default: if vv.ExamCode != compareStus[x].ExamCode { cancel() //如果不一致就取消任務 return } } } sch <- index }(ctx, i) } defer cancel() defer close(sch) for { select {//select語句 case <-ctx.Done(): return false, nil //執行了這個地方就表示不一致了 case <-sch: if len(sch) == 0 { return true, nil } } }
到此,相信大家對“golang使用context關閉go routine的方法”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。