go語言:一個簡單的goroutine同步(synchronize)

咱們可使用channels在多個goroutine之間進行同步(synchronize), 下面直接看例子。
例子 1, 使用chan等待一個goroutine結束。函數

package main

import "fmt"
import "time"

//在這定義一個函數,以goroutine的方式運行。使用done這個chan來通知
//其它的函數本函數的工做已成。這個例子是通知main函數。
func worker(done chan bool) {
    fmt.Print("working...")
    for i:=0;i<10;i++ {
        time.Sleep(time.Second)
        fmt.Print(".")
    }
    fmt.Println("done")

    // 函數結束時,給chan賦值
    done <- true
}

func main() {

    // Start a worker goroutine, giving it the channel to
    // notify on.
    //啓動一個goroutine並給傳入一個chan
    c := make(chan bool, 1)
    go worker(c)

    // main函數在沒有收到chan的值時會一直block.
    <-c //若是沒有這句, mai函數會當即退出而不會等待worker
}

例子2, 函數B在 函數A結束後運行。code

package main

import (
  "fmt"
  "time"
)
//定義函數A,以goroutine的方式運行
func workerA(done chan bool){
  fmt.Print("A is running")
  for i:=0;i<10;i++{
    fmt.Print(".")
    time.Sleep(1 * time.Second)
  }
  fmt.Println("done")

  done <- true
}

//定義函數B,以gortoutine的方式運行
func workerB(){
  fmt.Print("B is running")
  for i:=0;i<10;i++{
    fmt.Print(".")
    time.Sleep(1 * time.Second)
  }
  fmt.Println("done")
}

func main(){
  c:= make(chan bool, 1)
  //啓動A,傳入chan c
  go workerA(c)
    
  //只有A運行結束時,B才能運行
  select {
  case <-c:
    go workerB()
    //fmt.Println("B is done !")
  }
  
  // wait for workerB exit.
  // 爲防止main函數在B以前退出,等待一段時間。
  time.Sleep(20*time.Second)
}
相關文章
相關標籤/搜索