当前位置: 首页 > 编程笔记 >

golang使用信号量热更新的实现示例

况谦
2023-03-14
本文向大家介绍golang使用信号量热更新的实现示例,包括了golang使用信号量热更新的实现示例的使用技巧和注意事项,需要的朋友参考一下

配置文件热更新是服务器程序的一个基本功能,通过热更新可以不停机调整程序的配置,特别是在生产环境可以提供极大的便利,比如发现log打得太多了可以动态调高日志等级,业务逻辑参数变化,甚至某个功能模块的开关等都可以动态调整。

package main  
import ( 
  "encoding/json" 
  "fmt" 
  "io/ioutil" 
  "log" 
  "os" 
  "os/signal" 
  "sync" 
  "syscall" 
) 
 
//用json配置测试 
type Config struct { 
  Test1 string `json:"Test1:` 
  Test2 int  `json:"Test1:` 
} 
 
var ( 
  config   *Config 
  configLock = new(sync.RWMutex) 
) 
 
func loadConfig() bool { 
  f, err := ioutil.ReadFile("config.json") 
  if err != nil { 
    fmt.Println("load config error: ", err) 
    return false 
  } 
 
  //不同的配置规则,解析复杂度不同 
  temp := new(Config) 
  err = json.Unmarshal(f, &config) 
  if err != nil { 
    fmt.Println("Para config failed: ", err) 
    return false 
  } 
 
  configLock.Lock() 
  config = temp 
  configLock.Unlock() 
  return true 
} 
 
func GetConfig() *Config { 
  configLock.RLock() 
  defer configLock.RUnlock() 
  return config 
} 
 
func init() { 
  if !loadConfig() { 
    os.Exit(1) 
  } 
 
  //热更新配置可能有多种触发方式,这里使用系统信号量sigusr1实现 
  s := make(chan os.Signal, 1) 
  signal.Notify(s, syscall.SIGUSR1) 
  go func() { 
    for { 
      <-s 
      log.Println("Reloaded config:", loadConfig()) 
    } 
  }() 
} 
 
func main() { 
  select {} 
} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。

 类似资料:
  • 本文向大家介绍golang模拟实现带超时的信号量示例代码,包括了golang模拟实现带超时的信号量示例代码的使用技巧和注意事项,需要的朋友参考一下 前言 最近在写项目,需要用到信号量等待一些资源完成,但是最多等待N毫秒。在看本文的正文之前,我们先来看下C语言里的实现方法。 在C语言里,有如下的API来实现带超时的信号量等待: 然后在查看golang的document后,发现golang里并没有实现

  • 目标 建立一个lesson2项目,内容与上一节的lesson1项目一致,当用浏览器访问http://localhost:8080/index.html时,修改任一html、css、js、图片文件,页面都会自动刷新。 挑战 在原项目的基础上,将‘hello world’修改成‘你好 世界’、字体颜色修改成#ccc、并在2秒之后渐隐,浏览器页面http://localhost:8080/index.h

  • 本文向大家介绍Java 信号量Semaphore的实现,包括了Java 信号量Semaphore的实现的使用技巧和注意事项,需要的朋友参考一下 近日于LeetCode看题遇1114 按序打印,获悉一解法使用了Semaphore,顺势研究,记心得于此。 此解视Semaphore为锁,以保证同一时刻单线程的顺序执行。在此原题上,我作出如下更改。 10个线程的常量池中,分别调用R1,R2,R3的方法多次

  • 本文向大家介绍解读golang plugin热更新尝试,包括了解读golang plugin热更新尝试的使用技巧和注意事项,需要的朋友参考一下 当我们在使用php开发的时候,基本不需要关心热更新这件事的,因为PHP本身已经帮我处理好了,只需要提交代码,PHP重新解释一遍即可。而go则是静态语言,编译后得到的是直接被机器执行的,所有代码已经翻译成相对应的机器指令并且在运行时已经加载到内存,不能动态更

  • 本文向大家介绍如何使用信号量实现监视器?,包括了如何使用信号量实现监视器?的使用技巧和注意事项,需要的朋友参考一下 为了使用信号量实现监视器,为每个监视器提供了一个信号量互斥锁(已初始化为1)。Wait(mutex)必须在进入监视器之前由进程执行,并且必须在离开监视器之后执行signal(mutex)。由于信令过程必须等待,直到恢复的过程离开或等待,所以引入了另一个信号量(下一步),初始化为0。信

  • 我没有使用足够奇怪的信号灯 无论如何,我在查看一些使用它的代码时发现,与锁不同,许可证可以由另一个线程发布(即没有所有权) 我研究了并发操作,它说(第98页): 实现没有实际的许可对象。。。。因此,一个线程获得的许可证可以由另一个线程发布 我之前没有注意到这个细节,并查看了一本操作系统教科书,上面写着(我的重点): 当一个进程修改信号量值时,没有其他进程。。。。等 那么这是Java具体的设计决定吗