Golang控制goroutine的啓動與關閉

  最近在用golang作項目的時候,使用到了goroutine。在golang中啓動協程很是方便,只須要加一個go關鍵字:java

   

 go myfunc(){

      //do something
 }()

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

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

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

原理比較簡單,這裏不詳細說了,直接看源碼就能夠了。具體使用示例:golang

 

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))
}
相關文章
相關標籤/搜索