[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的需求,所以结合当前业务,我挑选了阿里云开源的一 ...
随机推荐
- ActiveMQ入门之四--ActiveMQ持久化方式
消息持久性对于可靠消息传递来说应该是一种比较好的方法,有了消息持久化,即使发送者和接受者不是同时在线或者消息中心在发送者发送消息后宕机了,在消息中心重新启动后仍然可以将消息发送出去,如果把这种持久化和 ...
- ping第一包时间过长
一.现象 公司互联网域(说白了就是可以连外网的vlan区域的主机)的几台主机在ping一个合作方提供的域名时,发现在ping 第一个包时,时间特别长,后面第2--N包开始正常.直接ping 该域名对应 ...
- 【UVA】12100 Printer Queue(STL队列&优先队列)
题目 题目 分析 练习STL 代码 #include <bits/stdc++.h> using namespace std; int main() { int t; sc ...
- 浅谈PHP面向对象编程(九、设计模式)
9.0 设计模式 在编写程序时经常会遇到一此典型的问题或需要完成某种特定需求,设计模式就是针对这些问题和需求,在大量的实践中总结和理论化之后优选的代码结构编程风格,以及解决问题的思考方式. 设计模式就 ...
- python‘s first day for me
计算机的基础 1,计算机由硬件及软件组成. 其中硬件主要包括了cpu,内存以及硬盘.软件则由操作系统以及一系列软件. 操作系统则可以操控硬件,使硬件完成一些需要的操作. python的历史 1989年 ...
- 使用CXF发布和调用webservice之HelloWorld入门
依赖的JAR cxf-2.2.10.jar jetty-6.1.21.jar jetty-util-6.1.21.jar servlet-2_5-api.jar ...
- python开发_python中for循环操作
如果你对python中的for循环不是很清楚,请看看这篇文章:”for循环控制语句——菜鸟的Python笔记“ 下面是我做的一些学习记录供大家参考: #基本的for循环语句 test_list = [ ...
- 爬虫验证码处理与IP处理
引入 相关的门户网站在进行登录的时候,如果用户连续登录的次数超过3次或者5次的时候,就会在登录页中动态生成验证码.通过验证码达到分流和反爬的效果. - 1.对携带验证码的页面数据进行抓取 - 2.可以 ...
- Oracle11gR2--手工建库&dbca建库
1 Oracle11gR2 dbca建库 [oracle@localhost ~]$ cd $ORACLE_BASE/database [oracle@localhost database]$ dbc ...
- Linux 环境下wordpress后台安装主题及插件需要FTP帐号怎么办?
vi httpd.conf 查看user是哪个用户 我的是daemon 然后执行 chown daemon:daemon -R /data/wordpress /data/wordpress 是我的 ...