golang轮询机制select的理解

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)
}	

//select的轮询机制
func fibonacci(c chan int, quit chan int) {
	x, y := 0, 1
	for {
		select { // select轮询机制
		case c <- x:
			x, y = y, x+y
		case <-quit:
			fmt.Println("quit")
			return
		}
	}
}

main中执行fibonacci函数时候,select有收发管道数据,顺序执行case时候发数据会阻塞,
知道有读取发的数据,然后继续执行,轮询阻塞,知道收到quit管道数据的时候return

执行结果:
        0
	1
	1
	2
	3
	5
	8
	13
	21
	34
	quit
	
时间: 2024-09-30 17:10:58

golang轮询机制select的理解的相关文章

golang+sse+angular的心跳机制、angullar的轮询机制、time.Duration和time.NewTicker的学习

长连接断开的原因 连接超时,浏览器自动断开连接 进程被杀死 不可抗拒因素 根据不同情况,高效保活的方式 连接超时:心跳机制 进程保活 断线重连 重点心跳机制 产物 心跳包 心跳应答 轮询与心跳区别 轮询一次相当于:建立一次TCP连接+断开连接 心跳:在已有的连接上进行保活 心跳设计要点 心跳包的规格(内容&大小) 心跳发送间隔时间(按照项目的特性进行判断) 断线重连机制(核心= 如何判断长连接的有效性) 心跳具体实现(基于sse的长连接) 客户端做心跳机制:客户端长时间没有反应,使用心跳机制,证

OSChina客户端源码学习(3)--轮询机制的实现

主要以OSChina Android客户端源码中Notice的轮询机制进行解读. 一.基础知识 一般IM(即使通讯)的实现有两种方式:推送和轮询,推送就是服务器主动向客户端发送消息,用特定的协议比如XMPP.MQTT.另一种是轮询,实时性并不高,而且比较耗电.这种有分为两种情况:一段时间发起一次查询和死循环进行查询. 参考: http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/0401/1609.html 远端Service调用: a.服

OSChinaclient源代码学习(3)--轮询机制的实现

主要以OSChina Androidclient源代码中Notice的轮询机制进行解读. 一.基础知识 一般IM(即使通讯)的实现有两种方式:推送和轮询,推送就是server主动向client发送消息,用特定的协议比方XMPP.MQTT. 还有一种是轮询,实时性并不高.并且比較耗电.这样的有分为两种情况:一段时间发起一次查询和死循环进行查询. 參考: http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/0401/1609.html 远端S

Keepalived 之 双主模式+DNS轮询机制 实现高负载

一.Keepalived双主模式+DNS轮询机制作用 作用:在单主模式下,备机通常会以等待状态放着,不接受任何数据,导致所有数据请求只往主机-负载均衡发送,做成资源浪费:而双主模式,即创造两个VIP,两个VIP分别放在两台负载均衡的机器上,同时两台主机均为对方的备机,以作VIP的漂移,服务接管作用,加入DNS轮询机制,使客户端的域名分别依次解释到两个VIP上,形成两台负载均衡主机同时对外提供服务.同时也解决了单主模式下的单机性能屏颈. 二.网络拓扑图 三.两台负载均衡主机的Keepalived

3. 闭包_对象组合继承模式_事件轮询机制

1.谈谈闭包? (产生条件.是什么.在哪里.作用.生命周期.缺点) 产生闭包的三个条件: 函数嵌套 内部函数引用外部函数的局部变量 执行外部函数 包含被引用的局部变量的一个"对象",  通过 chrome 开发者工具可以调试查看到,就是 closure,它存在嵌套的内部函数中 作用: 延长了局部变量的存活时间, 让函数外部可以操作(读写)到函数内部的数据(变量/函数) 闭包的生命周期: 产生 :  在嵌套内部函数定义执行完时就产生了(不是在调用) 死亡 :  在嵌套的内部函数成为垃圾对

Linux中的DNS 正向解析与反向解析,轮询机制

1.正向解析 (域名转换为IP地址) 1.vim /etc/named.conf 修改如下 2.编辑dns的副配置文件vim /etc/named.rfc1912.zones 3.cd var/named/cp -p named.localhost bruce.com.zone 复制其文件包括权限属性原文件修改vim bruce.com.zone 4.修改完成后正向解析的记录加好重启服务systemctl restart named 重启服务systemctl stop firewalld 关闭

node.js的事件轮询机制

借助libuv库实现的 概括事件轮询机制:分为六个阶段1.timers 定时器阶段计时和执行到点的定时器回调函数 2.pending callbacks某些系统操作(例如TCP错误类型) 3.idle,prepare 4.poll轮询阶段(轮询队列)如果轮询队列不为空,依次同步取出轮询队列中第一个回调函数,直到轮询队列为空或者达到系统最大限制如果轮询队列为空 如果之前设置过setImmediate函数,直接进入下一个check阶段,如果之前没有设置过setImmediate函数,在当前 poll

中断和轮询 VS select和epoll

一. select和epoll 首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象.不管是文件,还是套接字,还是管道,我们都可以把他们看作流. 通过read,我们可以从流中读入数据:通过write,我们可以往流写入数据. 现在假定一个情形,我们需要从流中读数据,但是流中还没有数据,典型的例子为,客户端要从socket读如数据,但是服务器还没有把数据传回来,这时候该怎么办? 阻塞.阻塞是个什么概念呢?比如某个时候你在等快递,但是你不知道快递什么时候过来

JS中的异步以及事件轮询机制

一.JS为何是单线程的? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事.那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊.(在JAVA和c#中的异步均是通过多线程实现的,没有循环队列一说,直接在子线程中完成相关的操作) JavaScript的单线程,与它的用途有关.作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM.这决定了它只能是单线程,否则会带来很复杂的同步问题.比如,假定JavaScript同时有两个线程,一个