• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

go语言:一个简单的goroutine同步(synchronize)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

我们可以使用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结束后运行。

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)
}

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
client-go系列之3---restclient的使用发布时间:2022-07-10
下一篇:
Go语言学习记录之一(返回指针与返回值的区别)发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap