Go 如何去停止 goroutine

Yi Jyun
1 min readMar 28, 2020

--

使用 goroutine 的時候,總是會有個疑問?

我該怎麼樣去停止 goroutine。因為 goroutine 不像 C 語言之類,可以獲得對應的 id 之類的。

void doSomeThing(){
...
}
int main()
{
pthread_t tid;
pthread_create(&(tid[i]), NULL, &doSomeThing, NULL);
pthread_kill(tid,0)
}

Go 目前用 channel 或 context 的方式來發送取消 (cancelation) 給 goroutine。

Channel

建立一個 channel,讓 goroutine 去監聽事件。當 close channel 後,goroutine 便收到 close 的事件。

Context

現在若是在一個 tree 狀結構的 go-routing。要停止 sub-tree 的 goroutine,使用 channel 的方式就些許不便。

go 在 1.7 版引入 Context。用來傳遞事件給 go-routine。

目前支援 WithCancel, WithDeadline, WithTimeout, or WithValue. 詳細用法請參考 context

參考

  1. Go 语言设计与实现
  2. The Go bloger : Go Concurrency Patterns: Context
  3. Context should go away for Go 2
  4. Package Context

--

--