我们可以使用Channel来同步不同goroutines的执行。看下面的代码:

package main

import "fmt"

import "time"

//这个函数会在新的goroutine中运行,执行结束时会给done channel中传入值true

//注意到中间有sleep了一秒

func worker(done chan bool) {

fmt.Print("working...")

time.Sleep(time.Second)

fmt.Println("done")

//channel中传入值true

done <- true

}

func main() {

//创建一个channel,用于goroutine之间通知情况

done := make(chan bool, )

//开启goroutine,并把done channel传进去

go worker(done)

//如果done channel中一直没有数据,这里就会卡住,直到worker结束时传入值以后,这里才会继续执行

<-done

}

运行结果:

working...done

如果我们把main函数最后一句代码:<-done,去掉以后,不会输出任何数据。

因为主线程已经执行完退出了,goroutine依赖于主现程,也会退出。用古话说是:

皮之不存,毛將焉附?

覆巢之下,安有完卵?

国之不存,何以家为?

问题:

A主线程启动B1 B2 两个goroutine,B1 启动了C11 C12两个goroutine。如果B1执行结束,C11 C12会退出吗?

结论:不会

Go channel同步的更多相关文章

  1. golang的缓冲channel和无缓冲channel的区别

    话说golang的channel同步的定义真是让人无力吐槽,码农的用户体验就这么难搞么,超耐磨阿,无缓冲和缓冲居然有这么大区别....靠 转载一段网上的资料 --------------------- ...

  2. 2.7 Go channel

    channel简单示例 package main import ( "fmt" "time" ) //channel的创建,发送,接收 func channe1 ...

  3. mysql数据库同步系统otter部署实践(中国与欧洲同步)

    otter的介绍就不说了, 自己去看官网https://github.com/alibaba/otter/wiki 本系统中, 中国的服务器部署在阿里云上, 欧洲服务器部署在亚马逊上, 由于阿里云的网 ...

  4. 【GoLang】golang 最佳实践汇总

    最佳实践 1 包管理 1.1 使用包管理对Golang项目进行管理,如:godep/vendor等工具 1.2 main/init函数使用,init函数参考python 1.2.1 main-> ...

  5. 【Go】为什么用go; Golang Erlang 前世今生

    给自己一条退路,再次比较Erlang和Golang 2014-6-28 陈叶皓 chenyehao@gmail.com 雨天的周末,适合码字的时节... 一年前我开始学习go语言的时候,如获至宝,既有 ...

  6. Go - concurrency

    并发 vs 并行 首先,我们先来搞清楚概念以及并发和并行的区别. 并发 - 利用时间片切换来实现“同时”运行的. 并行 - 利用CPU的多核来实现通过多线程来实现同时运行. Go 语言的设计理念就是通 ...

  7. Flutter 实现原理及在马蜂窝的跨平台开发实践

    一直以来,跨平台开发都是困扰移动客户端开发的难题. 在马蜂窝旅游 App 很多业务场景里,我们尝试过一些主流的跨平台开发解决方案, 比如 WebView 和 React Native,来提升开发效率和 ...

  8. main函数中如何等待协程运行完毕

    使用channel同步 package main import ( "fmt" ) func printNumber(num int, c chan struct{}) { fmt ...

  9. Go初探

      官方网站:https://golang.org/ 标准库文档:https://golang.org/pkg/ 在线编码学习:https://play.golang.org/ PS:请自行FQ 简介 ...

随机推荐

  1. Some regret....

    今天是一个败笔,早上10点才起床,下午又不专心看书,晚上把还是不能静下来...... 把所有的时间都花在了那一篇FlowVisor上了,但是却没有任何收获,居然没看懂,等下好好整理一下逻辑. 明天开始 ...

  2. BG雪碧图制作要求

    使用软件 firework 保存png-8 然后参数如下图: 格式:PNG 8 调色板:最适合 深度:128 透明度:Alpha 透明度

  3. Loadrunner:集合点(Rendezvous)

    集合点:等到特定的用户数后再一起执行某个操作,比如一起登录.一起发信,一般情况下使用不到集合点,不过,订票系统或者促销类需要用到,比如说某个促销品的促销时间在8点到8点30,这样的话,就可能出现在8点 ...

  4. XML处理

    //生成XML XmlDocument xmlDoc = new XmlDocument(); XmlElement root = xmlDoc.CreateElement("Data&qu ...

  5. 查看cics 运行状态

     查看cics 运行状态cicscp -v status all 

  6. centos6.5_x86_64安装Adobe Flash Player

    对x86_64的CentOS6.5系统,安装FireFox的Adobe Flash Player插件 安装插件,终端下输入命令:#wget http://linuxdownload.adobe.com ...

  7. Entity Framework with NOLOCK

    在SqlServer中,频繁在同一个数据库表同时进行读写的时候,会存在锁的问题,也就是在前一个insert.update.delete事务操作完毕之前,你不能进行读取,必须要等到操作完毕,你才能进行s ...

  8. linux服务方式启动程序脚本(init.d脚本)

    这才是真正正确的让jar后台启动的脚本,网络上的各种nohoup的脚本都是临时执行一次任务用的. #!/bin/sh # # init.d script # # ### BEGIN INIT INFO ...

  9. Java transient volatile关键字(转)

    Volatile修饰的成员变量在每次被线程访问时,都强迫从主内存中重读该成员变量的值.而且,当成员变量发生变化时,强迫线程将变化值回写到主内存.这样在任何时刻,两个不同的线程总是看到某个成员变量的同一 ...

  10. 不复杂的Autofac注入

    private static void SetAutofacWebAPI() { var builder = new ContainerBuilder(); #region 配置注册方法 string ...