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中的热插拔一个意思,就是在运行中对程序的模块进行更新.这个功能主要是用于开发过程中,对生 ...
随机推荐
- js 技巧 (十)广告JS代码效果大全 【1】
广告JS代码效果大全 1.[普通效果] 现在很多网站广告做的如火如荼,现在我就来介绍一下常见的对联浮动广告效果的代码使用方法,介绍的这种效果,在1024*768分辨率下正常显示,在800*60 ...
- Python数据类型方法
Python认为一切皆为对象:比如我们初始化一个list时: li = list('abc') 实际上是实例化了内置模块builtins(python2中为__builtin__模块)中的list类: ...
- MySQL简单查询和单表查询
MySQL记录操作 概览 MySQL数据操作: DML 在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括 使用INSERT实现数据的插入 UPDATE实现数据的更新 使用 ...
- 【03】placeholder
placeholder 表单占位符解决方案 Css Code :-moz-placeholder, ::-webkit-input-placeholder{ color: #bfbfbf; } . ...
- git-svn 简易 操作指南
git-svn 简易 操作指南 本文用以为使用svn的用户提供git操作指导,方便使用git管理用户自己的 本地修改 1:下载 库 下载全部历史记录 git svn clone svn://fhnws ...
- 九度oj 题目1058:反序输出
题目1058:反序输出 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:9677 解决:3495 题目描述: 输入任意4个字符(如:abcd), 并按反序输出(如:dcba) 输入: 题目可 ...
- hdu 4431 绝对值之和最小公式
/* 普通的二分不好写,反正我没写出来,这题核心需要求出绝对值最小公式 sum=|x+10|+|x+5|+|x+1|+|x-2|+|x-6|;sumx[1]=-10;sumx[2]=-15;sumx[ ...
- Python模块:logging、
logging模块: 很多程序都有记录日志的需求,并且日志中包含的信息既有正常的程序访问日志,还可能有错误.警告等信息输出.Python的logging模块提供了标准的日志接口,你可以通过它存储各种格 ...
- 无法打开物理文件 "X.mdf"。操作系统错误 5:"5(拒绝访问。)"。 (Microsoft SQL Server,错误: 5120)解决
环境 SQLServer 2008 R2 问题 附加数据库出现“无法打开物理文件 "X.mdf".操作系统错误 5:"5(拒绝访问.)". (Microsoft ...
- 安装最新版本的zabbix
1. 先安装php5.4 最新版本: yum安装php5.4或5.5 https://blog.csdn.net/MarkBoo/article/details/49424183 2. 然后参照官网或 ...