Golang控制goroutine的啟動與關閉


  最近在用golang做項目的時候,使用到了goroutine。在golang中啟動協程非常方便,只需要加一個go關鍵字:

   

 go myfunc(){

      //do something
 }()

   但是對於一些長時間執行的任務,例如:

 go loopfunc(){
          for{
      //do something repeat
           }
  }()

在某些情況下,需要退出時候卻有些不方便。舉個例子,你啟動了一個協程,長時間輪詢處理一些任務。當某種情況下,需要外部通知,主動結束這個循環。發現,golang並沒有像java那樣中斷或者關閉線程的interrupt,stop方法。於是就想到了channel,通過類似信號的方式來控制goroutine的關閉退出(實際上並不是真的直接關閉goroutine,只是把一些長時間循環的阻塞函數退出,然后讓goroutine自己退出),具體思路就是就是對於每個啟動的goroutine注冊一個channel。為了方便后續使用,我封裝了一個簡單的庫:https://github.com/scottkiss/grtm

原理比較簡單,這里不詳細說了,直接看源碼就可以了。具體使用示例:

 

package main

import (
        "fmt"
        "github.com/scottkiss/grtm"
        "time"
       )

func myfunc() {
    fmt.Println("do something repeat by interval 4 seconds")
    time.Sleep(time.Second * time.Duration(4))
}

func main() {
        gm := grtm.NewGrManager()
        gm.NewLoopGoroutine("myfunc", myfunc)
        fmt.Println("main function")
        time.Sleep(time.Second * time.Duration(40))
        fmt.Println("stop myfunc goroutine")
        gm.StopLoopGoroutine("myfunc")
        time.Sleep(time.Second * time.Duration(80))
}

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM