Go channel同步

我们可以使用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, 1)

//开启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会退出吗?

结论:不会

时间: 2024-10-29 19:11:49

Go channel同步的相关文章

golang中sync和channel同步机制

sync实例: package main import ( "fmt" "sync") var waitgroup sync.WaitGroup func Afunction(shownum int) { fmt.Println(shownum) waitgroup.Done() //任务完成,将任务队列中的任务数量-1,其实.Done就是.Add(-1)} func main() { for i := 0; i < 10; i++ { waitgroup.A

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

otter的介绍就不说了, 自己去看官网https://github.com/alibaba/otter/wiki 本系统中, 中国的服务器部署在阿里云上, 欧洲服务器部署在亚马逊上, 由于阿里云的网络不支持外网回环访问(即在本机上向本机的外网地址发送数据), 所以需要将node与manager部署在不同的主机上.如果只是在虚拟机中调试, 很多服务都可以放在一台主机中. 1. 阿里云服务器 1. mysql服务, 外网ip 120.x.x.1,  内网ip 10.x.x.1 2. manager

Go初探

官方网站:https://golang.org/ 标准库文档:https://golang.org/pkg/ 在线编码学习:https://play.golang.org/ PS:请自行FQ 简介安装Hello World 实例编译基础语法行分隔符注释标识符关键字数据类型指针类型(Pointer)数组(Array)结构化类型(struct)接口类型(interface)Map 类型Any类型类型转换类型增加方法变量作用域值类型和引用类型常量iota运算符运算符优先级条件与循环语句函数返回多个值参

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

给自己一条退路,再次比较Erlang和Golang 2014-6-28 陈叶皓 [email protected] 雨天的周末,适合码字的时节... 一年前我开始学习go语言的时候,如获至宝,既有python的编码效率,又带来性能的15倍提升.尤其是在异步编程方面,可以使用channel同步线程,不必加锁可以充分利用cpu多核计算,真是没有弱点. 后来慢慢了解到,这种无锁异步编程的思想,源自一门叫做erlang的语言,Erlang更加了不起.除了异步编程之外,这门语言天生支持分布式,单机上开发的

oracle 数据库备份恢复

问题: 1.逻辑备份是否包含表结构 答案包含表结构 2.Rman是逻辑备份还是物理备份,属于也备份吗 答案物理备,属于热备份 3.热备份的方式是什么 答案:SQL下的命令备份或是Rman备份 4.热备份能备份哪些文件 5.联机重做文件有什么作用 答案:在Oracle数据库中,执行数据修改操作后,并不是马上写入数据文件,而是首先生成重做信息,并写入SGA中的一块叫LOG_BUFFER的固定区域,LOG_BUFFER有一定的触发条件,当满足触发条件后,会有相应进程将LOG_BUFFER中的内容写入数

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

使用channel同步 package main import ( "fmt" ) func printNumber(num int, c chan struct{}) { fmt.Println(num) c <- struct{}{} } func main() { sign := make(chan struct{}, 10) for i:=0;i<10;i++ { go printNumber(i, sign) } for i:=0;i<10;i++{ <

Go语言官网Example

参考文档:https://gobyexample.com/ 数组 package main import "fmt" func main() { var a [5]int fmt.Println("emp:", a) a[4] = 100 fmt.Println("set:", a) fmt.Println("get:", a[4]) fmt.Println("len:", len(a)) b := [5]

Golang的channel使用以及并发同步技巧

在学习<The Go Programming Language>第八章并发单元的时候还是遭遇了不少问题,和值得总结思考和记录的地方. 做一个类似于unix du命令的工具.但是阉割了一些功能,这里应该只实现-c(统计total大小) 和-h(以human比较容易辨识的显示出来)的功能. 首先我们需要构造一个 能够返回FileInfo信息数组的函数,我们把它取名为dirEntries: func dirEntries(dir string) []os.FileInfo { entries, er

利用channel在goroutins之间控制同步和传递数据

在java等代码中,我们查询数据库的操作: sql = "select * from ...."; result = db.query(sql) for(item in result) { ..... } 但是在go语言中,这么做就有些土了,我们可以利用channel天生的队列和线程同步的特性来实现.这也是go和其它语言很明显的思维区别. db的封装: package main var database *db type db struct { req chan string res