ex1

package main
/*
goroutine 是由GO运行时管理的轻量级线程
go f(x,y, z) 就启动了一个goroutine, 其中f,x,y,z在当前goroutine中立即计算, f内容的执行在另一个新goroutine中。
所有的goroutine都是运行在同一个地址空间中, 所有访问共享内存时,必须进行同步处理。
在sync包中上, 提供了同步需要的原语
*/
import (
"fmt"
"time"
) func say(s string) {
for i := 0; i < 5; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
} func main() {
go say("world")
say("hello")
}

ex2

package main

/*
Channels 就管道,就是剧导管, 你可能管道操作符进行读写, 操作符为 <-
ch <- v // 把 v 写入管道
v := <-ch // 从 ch 管道中读出到 v 变量中
数据的流向, 就箭头的指向。
所有 maps , slices, channels 复杂结构都需要通过make来创建
ch := make (chan int)
默认情况下, 发收都需要对端准备好了才行, 这样的前提使得goroutine同步就不需要显式的锁处理,降低了复杂度,简化的设计。 下面示例代码, 对slice的值求和。 分布式的工作在两个goroutine中。当其两个完成计算时,最终结果也计算出来了
*/ import "fmt" func sum(s []int, c chan int) {
sum := 0
for _, v := range s {
sum += v
}
c <- sum // send sum to c
} func main() {
s := []int{7, 2, 8, -9, 4, 0} c := make(chan int)
go sum(s[:len(s)/2], c)
go sum(s[len(s)/2:], c)
x, y := <-c, <-c // receive from c fmt.Println(x, y, x+y)
}

ex3

/*
Channels 就管道
导管通过第二个参数,是可以指定其缓存长度的
ch := make(chan int, 100)
当管道满时, 发送会阻塞
当管道空时, 接收会阻塞 修改下面的代码,可以进行测试一下
*/ package main import (
"fmt"
"time"
) // 例1、写阻塞等待
func put_chan(ch chan int, n int) {
for i := 0 ; i < n; i++{
fmt.Println("put: ", i, time.Now().UTC())
ch <- i
}
close(ch)
} func read_chan(ch chan int, quit chan int) {
for c := range ch{
time.Sleep(time.Duration(time.Second * 3))
fmt.Println(c, time.Now().UTC())
}
time.Sleep(time.Duration(time.Second * 3))
quit <- 1
}
func main() {
ch := make(chan int, 2)
quit := make(chan int)
go put_chan(ch, 10)
go read_chan(ch, quit) fmt.Println("end", <- quit, time.Now().UTC()) } //// 例2、读阻塞等待
//func put_chan(ch chan int, n int) {
// for i := 0 ; i < n; i++{
// time.Sleep(time.Duration(time.Second * 3))
// ch <- i
// }
// time.Sleep(time.Duration(time.Second * 3))
// close(ch)
//}
//
//func read_chan(ch chan int, quit chan int) {
// for c := range ch{
// fmt.Println(c, time.Now())
// }
// quit <- 1
//}
//func main() {
// ch := make(chan int, 2)
// quit := make(chan int)
// go put_chan(ch, 2)
// go read_chan(ch, quit)
//
//
// fmt.Println("end", <- quit, time.Now())
//
//} // 例3、测试中发现,系统检测会出现死锁
//func main() {
// ch := make(chan int, 2)
// ch <- 1
// ch <- 2
// fmt.Println(<-ch)
// fmt.Println(<-ch)
// fmt.Println(<-ch)
// fmt.Println("end")
//
//}

ex4

/*
Channels Range & Close 范围排列与关闭
发送者可以通过关闭通道来通知没有更多数据需要发送了。
接收者可以检测通道是否已经关闭了,通过指定第二个参数来实现,具体如下
v , ok := <- ch
当ok为false, 则通道已经关闭,没有数据了。
或者可以使用循环 for i := range c 来取数据,至到通道关闭。
注意<惯例>:
1. 应该只让发送者来关闭通道。 绝对不要让接收者来关闭。 在一个已经关闭了的通道上发数据会引发panic
2. 通道,只在最终不要了, 需要终止的时候才来关闭之
*/ package main import (
"fmt"
) func fibonacci(n int, c chan int) {
x, y := 0, 1
for i := 0; i < n; i++ {
c <- x
x, y = y, x+y
}
close(c)
} func main() {
c := make(chan int, 10)
go fibonacci(cap(c), c)
for i := range c {
fmt.Println(i)
}
}

ex5

/*
Channels select 选择查询操作
选择查询语句, 让当前goroutine 等待多个通讯操作
当没有条件满足时, select阻塞
当有 条件满足时, select执行
当有多条件满足时, select随机执行满足条件之一
*/ package main import "fmt" func fibonacci(c, quit chan int) {
x, y := 0, 1
for {
select {
case c <- x: // 写
x, y = y, x+y
case <-quit: // 读
fmt.Println("quit")
return
}
}
} func main() {
c := make(chan int)
quit := make(chan int)
go func() {
for i := 0; i < 10; i++ {
fmt.Println(<-c)
}
quit <- 0
}()
fibonacci(c, quit)
}

ex6

/*
Channels select 选择查询操作
缺省选择, 当没有case条件满足时, 直接选择默认条件
*/ package main import (
"fmt"
"time"
) func main() {
tick := time.Tick(100 * time.Millisecond)
boom := time.After(500 * time.Millisecond)
for {
select {
case <-tick:
fmt.Println("tick.")
case <-boom:
fmt.Println("BOOM!")
return
default:
fmt.Println(" .")
time.Sleep(50 * time.Millisecond)
}
}
}

golang channel的更多相关文章

  1. golang channel的使用以及调度原理

    golang channel的使用以及调度原理 为了并发的goroutines之间的通讯,golang使用了管道channel. 可以通过一个goroutines向channel发送数据,然后从另一个 ...

  2. golang channel关闭后,是否可以读取剩余的数据

    golang channel关闭后,其中剩余的数据,是可以继续读取的. 请看下面的测试例子. 创建一个带有缓冲的channel,向channel中发送数据,然后关闭channel,最后,从channe ...

  3. golang channel原理

    channel介绍 channel一个类型管道,通过它可以在goroutine之间发送和接收消息.它是Golang在语言层面提供的goroutine间的通信方式. 众所周知,Go依赖于称为CSP(Co ...

  4. golang channel 用法转的

    一.Golang并发基础理论 Golang在并发设计方面参考了C.A.R Hoare的CSP,即Communicating Sequential Processes并发模型理论.但就像John Gra ...

  5. golang channel初次接触

    goroutine之间的同步 goroutine是golang中在语言级别实现的轻量级线程,仅仅利用go就能立刻起一个新线程.多线程会引入线程之间的同步问题,经典的同步问题如生产者-消费者问题,在c, ...

  6. 如何优雅的关闭Golang Channel?

    Channel关闭原则 不要在消费端关闭channel,不要在有多个并行的生产者时对channel执行关闭操作. 也就是说应该只在[唯一的或者最后唯一剩下]的生产者协程中关闭channel,来通知消费 ...

  7. golang channel几点总结

    golang提倡使用通讯来共享数据,而不是通过共享数据来通讯.channel就是golang这种方式的体现. Channel 在golang中有两种channel:带缓存的和不带缓存. 带缓存的cha ...

  8. golang channel 源码剖析

    channel 在 golang 中是一个非常重要的特性,它为我们提供了一个并发模型.对比锁,通过 chan 在多个 goroutine 之间完成数据交互,可以让代码更简洁.更容易实现.更不容易出错. ...

  9. golang channel本质——共享内存

    channel是golang中很重要的概念,配合goroutine是golang能够方便实现并发编程的关键.channel其实就是传统语言的阻塞消息队列,可以用来做不同goroutine之间的消息传递 ...

  10. Golang channel 用法简介

    channel 是 golang 里相当有趣的一个功能,大部分时候 channel 都是和 goroutine 一起配合使用.本文主要介绍 channel 的一些有趣的用法. 通道(channel), ...

随机推荐

  1. linux命令-diff对比文件工具

    diff 命令是 linux上非常重要的工具,用于比较文件的内容,特别是比较两个版本不同的文件以找到改动的地方.diff在命令行中打印每一个行的改动.最新版本的diff还支持二进制文件.diff程序的 ...

  2. AIX详细查看用户/进程使用内存

    本文来自:https://blog.csdn.net/mydriverc2/article/details/41956063 问题描述:通过topas发现%comp内存已使用98% 问题分析: 1,从 ...

  3. 探索 | “中医+AI”会诊电力设备故障

    在 AlphaGo 成功挑战围棋世界冠军后,人工智能(AI)“深度学习”家喻户晓.电力企业有机会着眼自身战略,利用落地的 AI 技术和应用聚焦业务流程优化.效率提升以及对全新机遇的发掘.本文针对设备故 ...

  4. day 06 编码and知识点总结

    1.day 05 内容回顾 dict:dic = {'name':'alex'} 增:dic['age']=21#存在就覆盖 dic.setdefault(),没有就增加 删除: pop()按照key ...

  5. python数据结构与算法之算法和算法分析

    1.问题.问题实例.算法的概念区分. 一个例子说明一下: 问题:判断一个正整数N是否为素数   #问题是需要解决的一个需求 问题实例:判断1314是否为素数? #问题实例是该问题的一个具体例子 算法: ...

  6. Ubuntu配置MYSQL远程连接

    一.修改mysql权限 1.mysql -u root -p  回车输入密码 2.use mysql:      打开数据库 3.将host设置为%表示任何ip都能连接mysql,当然您也可以将hos ...

  7. messageQ 消息队列

    之后就是对MessageQ的打开,关闭, 消息的发送和接受. MessageQ_create(),MessageQ_delete(): 对消息的创建和删除. MessageQ_open(); Mess ...

  8. 微信中扫描二维码自动打开手机系统默认浏览器下载APP(APK)

    很多朋友问我怎么解决微信内点击链接或扫描二维码可以直接跳出微信在外部浏览器打开网页链接,其实这并不难,只要我们实现微信跳转功能即可.下面给大家介绍这个功能 功能目的 生成微信跳转链接,实现微信内置浏览 ...

  9. GCP 谷歌云平台申请教程

    最近为了学个国外的课程,想要用谷歌云平台的GPU,谷歌云平台,新注册,赠送300美金,免费用一年.注册的时候发现,必须要有国外的信用卡,网上搜索,并试了几个解决方案. 1.不用信用卡,能不能申请成功? ...

  10. [图形学]VS2017中OpenGL的下载及安装中的异常

    1.放dll文件:C:\Windows\SysWOW64 或C:\Windows\windows32 2.lib和h:C:\Program Files (x86)\Microsoft Visual S ...