golang中管道热替换
golang中管道替换问题
https://blog.csdn.net/cyk2396/article/details/78875347
1.运行以下代码:
var chan1 chan int
var chanLength int = 18
var interval time.Duration = 1500 * time.Millisecond
//var interval2 time.Duration = 1800 * time.Millisecond
//golang在替换通道时引起的问题
func main() {
chan1 = make(chan int, chanLength)
//该goroutine是每隔1.5秒向chan1中发送一个元素,
//当满足条件时,重置chan1,此时chan1会指向一个新通道
go func() {
for i := 0; i < chanLength; i++ {
if i > 0 && i%3 == 0 {
fmt.Println("chan1 reset")
chan1 = make(chan int, chanLength)
}
fmt.Println("send an value : ", i)
chan1 <- i
time.Sleep(interval)
}
fmt.Println("close chan1")
close(chan1)
}()
//用于接收chan1中的元素
receive(chan1)
}
func receive(chan2 chan int) {
fmt.Println("start receive value from chan1 ...")
timer := time.After(30 * time.Second)
Loop:
for {
select {
case e, ok := <-chan2:
if !ok {
fmt.Println("chan1 has closed ...")
break Loop
}
fmt.Println("receive value : ", e)
time.Sleep(interval)
case <-timer:
fmt.Println("time out")
break Loop
}
}
}
结果如下:
start receive value from chan1 ...
send an value : 0
receive value : 0
send an value : 1
receive value : 1
send an value : 2
receive value : 2
chan1 reset
send an value : 3
send an value : 4
send an value : 5
chan1 reset
send an value : 6
send an value : 7
send an value : 8
chan1 reset
send an value : 9
send an value : 10
send an value : 11
chan1 reset
send an value : 12
send an value : 13
send an value : 14
chan1 reset
send an value : 15
send an value : 16
send an value : 17
close chan1
time out
引起这个的原因是:对变量的重新赋值操作是无法被传递的。在上面这个demo中,当chan1指向了新管道时,receive()函数还是调用原来的旧管道。
解决办法是:通过函数调用每次都获取最新的管道。代码如下:
var chan1 chan int
var chanLength int = 18
var interval time.Duration = 1500 * time.Millisecond
var interval2 time.Duration = 1550 * time.Millisecond
//golang在替换通道时引起的问题
func main() {
chan1 = make(chan int, chanLength)
//该goroutine是每隔1.5秒向chan1中发送一个元素,
//当满足条件时,重置chan1,此时chan1会指向一个新通道
go func() {
for i := 0; i < chanLength; i++ {
if i > 0 && i%3 == 0 {
fmt.Println("chan1 reset")
chan1 = make(chan int, chanLength)
}
fmt.Println("send an value : ", i)
chan1 <- i
time.Sleep(interval)
}
fmt.Println("close chan1")
close(chan1)
}()
//用于接收chan1中的元素
receive()
}
func receive() {
fmt.Println("start receive value from chan1 ...")
timer := time.After(30 * time.Second)
Loop:
for {
select {
case e, ok := <-getChan(): //通过getChan()每次都获取最新的管道
if !ok {
fmt.Println("chan1 has closed ...")
break Loop
}
fmt.Println("receive value : ", e)
time.Sleep(interval2) // 时间间隔相比发送方的时间间隔增加50ms,为了在getChan()时能获取最新的chan
case <-timer:
fmt.Println("time out")
break Loop
}
}
}
//获取管道chan1
func getChan() chan int {
return chan1
}
golang中管道热替换的更多相关文章
- java中的动态加载和热替换
https://blog.csdn.net/u010833547/article/details/54312052 ****************************************** ...
- Golang中的自动伸缩和自防御设计
Raygun服务由许多活动组件构成,每个组件用于特定的任务.其中一个模块是用Golang编写的,负责对iOS崩溃报告进行处理.简而言之,它接受本机iOS崩溃报告,查找相关的dSYM文件,并生成开发者可 ...
- Java_类的热替换
转自:http://www.ibm.com/developerworks/cn/java/j-lo-hotswapcls/#ibm-pcon Java ClassLoader 技术剖析 在本文中,我们 ...
- 使用自己的ClassLoader实现热替换
首先实现一个自己的ClassLoader,该ClassLoader重写findClass方法. 从classpath中加载类资源. 注意,不要重写loadClass方法. 因为在使用自定义的MyCl ...
- 【转】class卸载、热替换和Tomcat的热部署的分析
这篇文章主要是分析Tomcat中关于热部署和JSP更新替换的原理,在此之前先介绍class的热替换和class的卸载的原理.一 class的热替换ClassLoader中重要的方法 loadClass ...
- 基础知识 - Golang 中的正则表达式
------------------------------------------------------------ Golang中的正则表达式 ------------------------- ...
- class卸载、热替换和Tomcat的热部署的分析
一 class的热替换 ClassLoader中重要的方法 loadClassClassLoader.loadClass(...) 是ClassLoader的入口点.当一个类没有指明用什么加载器加载的 ...
- Java 类的热替换---转载
构建基于 Java 的在线升级系统 Java ClassLoader 技术剖析 在本文中,我们将不对 Java ClassLoader 的细节进行过于详细的讲解,而是关注于和构建在线升级系统相关的基础 ...
- 【webpack】-- 模块热替换
全称是Hot Module ReplaceMent(HMR),理解成热模块替换或者模块热替换都可以吧,和.net中的热插拔一个意思,就是在运行中对程序的模块进行更新.这个功能主要是用于开发过程中,对生 ...
随机推荐
- Mac使用Aria2下载百度网盘,突破下载限速的方法教程
百度网盘目前可以说是在国内网盘环境中一枝独秀,日常使用触及在所难免,尤其是对于喜欢下载资源的朋友来说,但是一些限制让它的使用越来越难,尤其是下载速度,普通用户的下载往往远低于自己的预期,特别是对于 M ...
- (转载)Catalan数——卡特兰数
Catalan数——卡特兰数 今天阿里淘宝笔试中碰到两道组合数学题,感觉非常亲切,但是笔试中失踪推导不出来后来查了下,原来是Catalan数.悲剧啊,现在整理一下 一.Catalan数的定义令h(1) ...
- 【已解决】ERROR: bootstrap checks failed memory locking requested for elasticsearch process but memory is not locked
官网说明: elasticsearch官网建议生产环境需要设置bootstrap.memory_lock: true 官网的解释 是:发生系统swapping的时候ES节点的性能会非常差,也会影响节点 ...
- 慕课笔记利用css进行布局【混合布局】
<html> <head> <title>混合布局学习</title> <style type="text/css"> ...
- 找出消耗CPU最高的进程对应的SQL语句
COLUMN PID FORMAT 999COLUMN S_# FORMAT 999COLUMN USERNAME FORMAT A9 HEADING "ORA USER"COLU ...
- codeforces 369B
#include<stdio.h>//题没读懂,没做出来 int main() { int n,k,l,r,s,s1,m,a,i; while(scanf("%d%d% ...
- 修改mysql root用户密码(忘记密码)
vi /etc/my.cnf,在[mysqld]中添加 skip-grant-tables 例如: [mysqld] skip-grant-tables datadir=/var/lib/mysql ...
- python中的is判断引用的对象是否一致,==判断值是否相等
python中的is判断引用的对象是否一致,==判断值是否相等 a = 10 b = 20 list = [1,2,3,4,5] print(a in list) print(b not in lis ...
- Android和MVC
Activity和Android的mvc模式 http://blog.csdn.net/dengshengjin2234/article/details/8502097 //android涉及到的 ...
- Android进程间通信之内部类作为事件监听器
在Android中,使用内部类能够在当前类里面发用改监听器类,由于监听器类是外部类的内部类.所以能够自由訪问外部类的全部界面组件. 下面是一个调用系统内部类实现短信发送的一个样例: SMS类: pac ...