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

來源:互聯網
上載者:User

標籤:out   star   函數   pac   import   channels   使用   print   art   

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

package mainimport "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結束後運行。

package mainimport (  "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)}

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.