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. mysql5.7版本yum安装---redhat7.0

    1.官网下载yum包 [root@test01 test]# wget http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch ...

  2. Spring IOC、AOP、Transaction、MVC小结

    1.IOC.AOP:把对象交给Spring进行管理,通过面向切面编程来实现一些“模板式”的操作,使得程序员解放出来,可以更多的关注业务实现.                             - ...

  3. hive -- 分区,分桶(创建,修改,删除)

    hive -- 分区,分桶(创建,修改,删除) 分区: 静态创建分区: 1. 数据: john doe 10000.0 mary smith 8000.0 todd jones 7000.0 boss ...

  4. Cognos集成至portal平台运行报表时只出“#”

    1. 问题描述 报表集成到平台后,运行报表过程中,当多次运行后,页面只显示“#” 2. 问题分析 这是因为浏览器筛选器限制问题 3. 解决方案 在IE浏览器设置中,Internet选项-安全-自定义级 ...

  5. There are multiple modules with names that only differ in casing. 黄色warning

    There are multiple modules with names that only differ in casing.有多个模块同名仅大小写不同This can lead to unexp ...

  6. python中的turtle库(图形绘画库)

    turtle绘图的基础知识:1. 画布(canvas) 画布就是turtle为我们展开用于绘图区域,我们可以设置它的大小和初始位置. 设置画布大小 turtle.screensize(canvwidt ...

  7. # -*- coding: utf-8 -*-

    -- coding: utf-8 -- import scrapy from jobscrawler_qianchengwuyou.items import JobscrawlerQianchengw ...

  8. python机器可读数据-json

    导入JSON数据相对简单.下面为打开.加载.导入.输出的操作. import json data = open('data.json').read() data = json.loads(data) ...

  9. SQL求几何重心

    ST_Centroid(geometry); geometry :a specified ST_Geometry e.g.: select ST_AsText(ST_Centroid('0103000 ...

  10. input 特殊字符限制

    ng-pattern="/^[A-Za-z0-9_,\.\u4e00-\u9fa5\s]+$/"