[GO]channel实现同步
goroutine运行在相同的地址空间,因此访问共享内存必须 做好同步。goroutine奉行通过通信来共享内存,而不是共享内存通信
它跟map一样,使用make来创建,它是一个引用 ,而不是值传递
make(chan Type, capacity)
channel <- value //发送value到channel
<- channel //接收并将其丢弃
x := <-channel //从channel中接收数据,并赋值给x
x, ok := <-channel //功能同上,同时检查通道是否已关闭或者是否为空
package main import (
"fmt"
//"time"
) var ch = make(chan int) func Printer(s string) {
for _, data := range s {
//fmt.Println(string(data))
fmt.Printf("%c", data)
//time.Sleep(time.Second)
}
}
//person1执行完成后才能到person2执行
func person1() {
Printer("hello")
ch <- //给管道定数据,发送,放在了打印的后面
} func person2() {
<- ch //从管道取数据,接收 ,如果通道没有数据他就会阻塞,放在了打印的前面
Printer("world")
} func main() {
go person1()
go person2()
for true {
}
}
先看执行的结果
helloworld
如何实现的?
首先需要知道的是person1和person2的子协程几乎是同时执行的,但是,因为person2在打印之前有一个管道的处理,而与几乎同时,person1已经在执行print语句了,执行完print语句后又向管道存了值
person2中的管道语句一看管道来值了,也就继续执行了后面的print语句,这样才实现了上面的结果
[GO]channel实现同步的更多相关文章
- 通过channel实现同步和数据交互
package main import ( "fmt" "time" ) func main(){ //创建channel ch := make(chan st ...
- 【GoLang】golang中 channel 实现同步 与mutex/atomic 实现同步的讨论
参考资料: https://groups.google.com/forum/#!topic/golang-china/q4pFH-AGnfs
- Go channel同步
我们可以使用Channel来同步不同goroutines的执行.看下面的代码: package main import "fmt" import "time" ...
- golang channel初次接触
goroutine之间的同步 goroutine是golang中在语言级别实现的轻量级线程,仅仅利用go就能立刻起一个新线程.多线程会引入线程之间的同步问题,经典的同步问题如生产者-消费者问题,在c, ...
- go语言中sync包和channel机制
文章转载至:https://www.bytelang.com/article/content/A4jMIFmobcA= golang中实现并发非常简单,只需在需要并发的函数前面添加关键字"Go&quo ...
- golang channel的使用以及调度原理
golang channel的使用以及调度原理 为了并发的goroutines之间的通讯,golang使用了管道channel. 可以通过一个goroutines向channel发送数据,然后从另一个 ...
- mysql同步之otter/canal环境搭建完整详细版
接上一篇mysql 5.7多源复制(用于生产库多主库合并到一个查询从库). 这一篇详细介绍otter/canal环境搭建以及当同步出现异常时如何排查.本文主要参考https://blog.csdn.n ...
- golang 多个routine之间的同步
本文以一个例子的方式介绍channel在同步中的使用. 下面的例子中,主task首先阻塞,直到两个task完成后,再继续执行. package main import ( "log" ...
- 高可用数据同步方案-SqlServer迁移Mysql实战
简介 随着业务量的上升,以前的架构已经不满足业务的发展,数据作为业务中最重要的一环,需要有更好的架构作为支撑.目前我司有sql server转mysql的需求,所以结合当前业务,我挑选了阿里云开源的一 ...
随机推荐
- Java-Runoob-面向对象:Java 多态
ylbtech-Java-Runoob-面向对象:Java 多态 1.返回顶部 1. Java 多态 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操 ...
- 使用apache common-io 监控文件变化
package common.io; import org.apache.commons.io.filefilter.FileFilterUtils; import org.apache.common ...
- (转) C#中Timer使用及解决重入(多线程同时调用callback函数)问题
原文链接: http://www.cnblogs.com/hdkn235/archive/2014/12/27/4187925.html
- cloudera manager卸载流程
注意:卸载Cloudera Manager后,根据需要保留或者删除集群中的Hadoop数据.下面的命令没有删除Hadoop数据,可以在控制台的Hadoop 和MapReduce /配置/选项卡,查看H ...
- c++获取lua嵌套table某属性的值
开发环境:vs2012 lua版本:LuaJIT-2.0.2 lua文件作为配置文件,c++读取这个配置. lua配置结构如下 SceneConfig = { [] = { name =}, [] = ...
- PHP正则表达式详解
正则表达式定义 正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串.将匹配的子串做替换或者从某个串中取出符合某个条件的子串等. 列目录时, ...
- leetcode914
public class Solution { public bool HasGroupsSizeX(int[] deck) { var len = deck.Length; ; i <= le ...
- dclcommon200.bpl
xe6 dclcommon200.bpl xe7 dclcommon210.bpl xe8 dclcommon220.bpl xe7,xe8都有对应的文件,xe6为何没有?
- 利用maven实现差异化配置
回顾过去 生产环境,测试环境,开发环境在不同的环境下会有各种各样的配置,比如数据库链接地址,账户名,密码等等.不同环境下都需要配置,但是配置却又不同.以前分享过一篇文章,介绍了我之前A公司的差异化配置 ...
- linux 确定网卡接口
方法: ifconfig -a 执行一遍:ifconfig -a: 插上网线 接口会 running. 方法:ethtool 执行 # ethtool -p eth0 时,eth0对应的网口的灯就 ...