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中的热插拔一个意思,就是在运行中对程序的模块进行更新.这个功能主要是用于开发过程中,对生 ...
随机推荐
- google查找笔记
1.可以选择MDN.WIKI等权威的网址资料
- 第二次:Ubuntu16.04 安装Docker
sudo apt-get update, 就这一个命令执行了多半天,不知道网络缘故还是怎么的,管他呢,装完总是好的. # step 1: 安装必要的一些系统工具 sudo apt-get update ...
- assert.notStrictEqual()详解
严格不相等测试,由不全等运算符确定(===). const assert = require('assert'); assert.notStrictEqual(1, 2); // OK assert. ...
- python 类的装饰器
我们知道,在不改变原有代码的基础上,我们可以使用装饰器为函数添加新的功能.同理,一切皆对象,我们也可以使用装饰器为类添加类属性.what? def deco(obj): obj.x = 1 obj.y ...
- linux目录文件操作
一.linux系统目录结构 1.顶层根目录 顶层根目录使用 “/”来表示 2.linux中的一些重要目录 (1)bin目录 放置常用的可执行文件(其中ls命令位列其中) (2)sbin目录 放置系统的 ...
- python 通过句柄获取窗口内容
-- enoding:utf-8 -- 生成 buffer 对象 import win32con from win32gui import PyMakeBuffer, SendMessage, PyG ...
- 分数拆分(刘汝佳紫书P183)
枚举,由已知条件推得y大于k,小于等于2K AC代码: #include"iostream"#include"cstring"using namespace s ...
- Flask(1):基本示例、配置文件、路由、请求和响应、模板渲染
Flask的特点: - pip install flask - 短小精悍.可扩展性强的 web框架 注意:上下文管理机制 - 依赖 wsgi:werkzeug Flask的简单示例: from fla ...
- linux shell 获得当前程序的路径
filepath=$(cd "$(dirname "$0")"; pwd) 脚本文件的绝对路径存在了环境变量filepath中,可以用 echo $filepa ...
- hiho一下 第四十九周 欧拉路
http://hihocoder.com/contest/hiho49/problem/1 给定无孤立结点图G,若存在一条路,经过图中每边一次且仅一次,该条路称为欧拉路. 一个无向图存在欧拉路当且仅当 ...