go中有缓存通道和无缓存通道区别

golang channel 有缓冲 与 无缓冲 是有重要区别的

我之前天真的认为 有缓冲与无缓冲的区别 只是 无缓冲的 是 默认 缓冲 为1 的缓冲式

其实是彻底错误的,无缓冲的与有缓冲channel有着重大差别

那就是一个是同步的 一个是非同步的

怎么说?比如

c1:=make(chan int)        无缓冲

c2:=make(chan int,1)      有缓冲

c1<-1

无缓冲的 不仅仅是 向 c1 通道放 1 而是 一直要有别的携程 <-c1 接手了 这个参数,那么c1<-1才会继续下去,要不然就一直阻塞着

而 c2<-1 则不会阻塞,因为缓冲大小是1 只有当 放第二个值的时候 第一个还没被人拿走,这时候才会阻塞。

打个比喻

无缓冲的  就是一个送信人去你家门口送信 ,你不在家 他不走,你一定要接下信,他才会走。

无缓冲保证信能到你手上

有缓冲的 就是一个送信人去你家仍到你家的信箱 转身就走 ,除非你的信箱满了 他必须等信箱空下来。

有缓冲的 保证 信能进你家的邮箱

看测试代码

有缓冲的

 1 package main
 2
 3 import "fmt"
 4
 5 var c = make(chan int, 1)
 6
 7 func f() {
 8
 9     c <- ‘c‘
10
11     fmt.Println("在goroutine内")
12 }
13
14 func main() {
15     go f()
16 
17     c <- ‘c‘
18     <-c
19     <-c
20
21     fmt.Println("外部调用")
22 }

无缓冲的

// pp
package main

import (
    "fmt"
)

func writeRoutine(test_chan chan int, value int) {

    test_chan <- value
}

func readRoutine(test_chan chan int) {

    <-test_chan

    return
}

func main() {

    c := make(chan int)

    x := 100

    //readRoutine(c)
    //go writeRoutine(c, x)

    //writeRoutine(c, x)
    //go readRoutine(c)

    //go readRoutine(c)
    //writeRoutine(c, x)

    go writeRoutine(c, x)

  
    go writeRoutine(c, x)
    readRoutine(c)

    fmt.Println(x)
}

可以在部分代码注释掉,看效果,再体会下

时间: 2024-10-27 11:31:57

go中有缓存通道和无缓存通道区别的相关文章

浅谈无缓存I/O操作和标准I/O文件操作差别

首先,先略微了解系统调用的概念: 系统调用,英文名system call,每一个操作系统都在内核里有一些内建的函数库,这些函数能够用来完毕一些系统系统调用把应用程序的请求传给内核,调用对应的的内核函数完毕所需的处理,将处理结果返回给应用程序,假设没有系统调用和内核函数,用户将不能编写大型应用程序,及别的功能,这些函数集合起来就叫做程序接口或应用编程接口(ApplicationProgramming Interface,API),我们要在这个系统上编写各种应用程序,就是通过这个API接口来调用系统

浅谈无缓存I/O操作和标准I/O文件操作区别

首先,先稍微了解系统调用的概念: 系统调用,英文名system call,每个操作系统都在内核里有一些内建的函数库,这些函数可以用来完成一些系统系统调用把应用程序的请求传给内核,调用相应的的内核函数完成所需的处理,将处理结果返回给应用程序,如果没有系统调用和内核函数,用户将不能编写大型应用程序,及别的功能,这些函数集合起来就叫做程序接口或应用编程接口(ApplicationProgramming Interface,API),我们要在这个系统上编写各种应用程序,就是通过这个API接口来调用系统内

无缓存I/O操作和标准I/O文件操作区别

本文转载于:http://www.360doc.com/content/11/0521/11/5455634_118306098.shtml 首先,先稍微了解系统调用的概念:       系统调用,英文名systemcall,每个操作系统都在内核里有一些内建的函数库,这些函数可以用来完成一些系统系统调用把应用程序的请求传给内核,调用相应的的内核函数完成所需的处理,将处理结果返回给应用程序,如果没有系统调用和内核函数,用户将不能编写大型应用程序,及别的功能,这些函数集合起来就叫做程序接口或应用编程

I/O供应的缓存类型:全缓存,行缓存,无缓存

文件缓存进程:当数据从内存向磁盘输出时,数据必需先送到缓存中,等到缓存满了或许次第恳求清空缓存的时分,数据才被写入磁盘. 全缓存:该类型中,文件的实习操作是缓存被布满以后进行的缓存没有完全被布满时,系统不会自动将文件写入磁盘.除非系统调用改写(flush操作强即将数据写入磁盘. 行缓存:输入和输出进程中遇到行结束标志的时分,规范I/O库就实行实习的I/O操作. 无缓存:系统不会为流分配内存,每一次规范I/O函数的调用都会使得底层I/O调用被实行. 文件的翻开与关闭 当系统操作一个文件时,会在内存

无缓存高效流(NoCacheStream)

场景:某个方法需要写入流,另一个方法需要将刚写入流的内容读取再处理,整个过程是一次性无需缓存的情况下,可以不使用MemoryStream,那个会占内存,同时由于MemoryStream容量的不固定,扩容的过程也会对性能产生影响.为了可以提供高效的流读写性能,设计一个无缓存流. 此流的写入和读取必须分为2个不同的线程,否则将无法正常工作,推荐写入使用后台线程,而读取使用当前线程,即直接当前线程使用该流对象(读取或返回). 此流的写入是基于读取的,如果没有读取,写入将无限等待,直到有读取动作,获取读

web-请求无缓存

<head><META HTTP-EQUIV="pragma" CONTENT="no-cache"><META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate"><meta http-equiv="Content-Type" content="text/html; charset

JSP设置无缓存

1.<% //设置无缓存 response.setHeader("progma","no-cache"); response.setHeader("Cache-Control","no-cache"); response.setDateHeader("Expires",0); %> 2.设置页面Nocache方式,即每次访问此页面,均需要从服务器重新读取,而不是使用缓存中存在的此页面. 在jsp

No caching ——无缓存工具

No caching --无缓存工具 无缓存工具阻止客户端应用程序(如Web浏览器)缓存任何资源,因此,请求总是发送到远程站点,所以我们总能看到最新版本. 适用场景 开发每次新部署了一版环境,说解决了XXBUG,但有时测试回归的时候会发现BUG并没有被解决,开发会质疑是不是缓存问题,有时候不是,有时候还真的是.不是的时候一直在那儿强刷很傻,真的是的时候场面会很尴尬--所以这个工具这种时候应该就会比较好用. 适用范围 该工具可以作用于每个请求(选中 Enable No Caching 即可),也可

MVC输出缓存(Cache:1.输出缓存2.应用程序缓存)

缓存前提概念: 1.使用缓存的目的就是为提供网站性能,减轻对数据库的压力,提高访问的速度. 2.如果使用缓存不当,比不使用缓存造成的影响更恶劣(缓存数据的更新不及时.缓存过多等). 3..net MVC 中有两种相应的缓存技术 :1.应用程序缓存 .2.输出缓存 应用程序缓存和输出缓存的区别 输出缓存:也就是Outputcache 是相对于某个Action或Controller而言.使用的场景包括某个页面的数据更新不是很频繁,不需要每次都从数据库区查询.缓存起来从内存中读取.比如文章详情,排名什