返回顶部
首页 > 资讯 > 后端开发 > GO >有什么办法可以阻止默认的golang程序完成
  • 548
分享到

有什么办法可以阻止默认的golang程序完成

2024-04-05 00:04:15 548人浏览 独家记忆
摘要

偷偷努力,悄无声息地变强,然后惊艳所有人!哈哈,小伙伴们又来学习啦~今天我将给大家介绍《有什么办法可以阻止默认的golang程序完成》,这篇文章主要会讲到等等知识点,不知道大家对其都有多少了解,下面

偷偷努力,悄无声息地变强,然后惊艳所有人!哈哈,小伙伴们又来学习啦~今天我将给大家介绍《有什么办法可以阻止默认的golang程序完成》,这篇文章主要会讲到等等知识点,不知道大家对其都有多少了解,下面我们就一起来看一吧!当然,非常希望大家能多多评论,给出合理的建议,我们一起学习,一起进步!

问题内容

我有一个使用 websocket 连接和数据库服务器。有些用户可以通过套接字连接,所以我需要在db中增加他们的“在线”;在他们断开连接的那一刻,我还减少了他们在数据库中的“在线”字段。但为了防止服务器崩溃,我使用在线用户的本地变量副本map[string]int。因此,我需要推迟服务器关闭,直到它完成一个数据库请求,该请求根据我的变量副本减少所有“在线”用户,因为这样套接字连接不会发送默认的“关闭”事件。

我找到了一个包 GitHub.com/xlab/closer,它可以处理一些系统调用,并且可以在程序完成之前执行一些操作,但我的数据库请求不能以这种方式工作(代码如下)

func main() {
  ...
  // trying to handle program finish event
  closer.Bind(cleanupSocketConnections(&pageHandler))
  ...
}

// function that handles program finish event
func cleanupSocketConnections(p *controllers.PageHandler) func() {
    return func() {
        p.PageService.ResetOnlineUsers()
    }
}

// this map[string]int contains key=userId, value=count of socket connections
type PageService struct {
    Users map[string]int
}

func (p *PageService) ResetOnlineUsers() {
    for userId, count := range p.Users {
        // decrease online of every user in program variable
        InfoService{}.DecreaseInfoOnline(userId, count)
    }
}

也许我使用不正确,或者可能有更好的方法来防止默认程序完成?


解决方案


首先,正如您所说,当服务器“崩溃”时执行任务非常复杂,因为崩溃可能意味着很多事情,并且当您的服务器出现严重问题时,没有什么可以保证清理功能的执行。

从工程角度来看(如果在故障时将用户设置为离线如此重要),最好是在另一台服务器上有一个辅助服务,该服务接收用户连接和断开连接事件以及 ping 事件(如果它没有收到任何消息)在设定的超时时间内更新,该服务会认为您的服务器已关闭,并继续将每个用户设置为离线。

回到你的问题,使用 defer 和等待终止信号应该可以覆盖 99% 的情况。我对代码进行了注释以解释逻辑。

// AllUsersOffline is called when the program is terminated, it takes a *sync.Once to make sure this function is perfORMed only
// one time, since it might be called from different Goroutines.
func AllUsersOffline(once *sync.Once) {
    once.Do(func() {
        fmt.Print("setting all users offline...")
        // logic to set all users offline
    })
}

// CatchSigs catches termination signals and executes f function at the end
func CatchSigs(f func()) {
    cSig := make(chan os.Signal, 1)
    // watch for  these signals
    signal.Notify(cSig, syscall.SIGKILL, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGHUP) // these are the termination signals in GNU =>  https://www.gnu.org/software/libc/manual/html_node/Termination-Signals.html
    // wait for them
    sig := <- cSig
    fmt.Printf("received signal: %s", sig)
    // execute f
    f()
}
func main() {
    
    // the once is used to make sure AllUsersOffline is performed ONE TIME.
    usersOfflineOnce := &sync.Once{}
    // catch termination signals
    go CatchSigs(func() {
        // when a termination signal is caught execute AllUsersOffline function
        AllUsersOffline(usersOfflineOnce)
    })
    // deferred functions are called even in case of panic events, although execution is not to take for granted (OOM errors etc)
    defer AllUsersOffline(usersOfflineOnce)
    
    // run server
    err := server.Run()
    if err != nil {
        // error logic here
    }
    // bla bla bla
}

我认为你需要看看goroutine频道
这里有一些(也许)有用的东西
Https://nathanleclaire.com/blog/2014/02/15/how-to-wait-for-all-goroutines-to-finish-executing-before-continuing/

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注编程网公众号,一起学习编程~

您可能感兴趣的文档:

--结束END--

本文标题: 有什么办法可以阻止默认的golang程序完成

本文链接: https://lsjlt.com/news/596466.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 有什么办法可以阻止默认的golang程序完成
    偷偷努力,悄无声息地变强,然后惊艳所有人!哈哈,小伙伴们又来学习啦~今天我将给大家介绍《有什么办法可以阻止默认的golang程序完成》,这篇文章主要会讲到等等知识点,不知道大家对其都有多少了解,下面...
    99+
    2024-04-05
  • 电脑默认打开程序的修改方法是什么
    电脑默认打开程序的修改方法可以通过以下步骤进行操作:1. 在Windows系统中,右键单击要修改默认打开程序的文件,选择“属性”选项...
    99+
    2023-09-11
    电脑
  • 计算机网络中应用程序里的指令可以分成什么
    小编给大家分享一下计算机网络中应用程序里的指令可以分成什么,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!应用程序里的指令可以分成中央处理器的指令集以及用于向操作系统请求特定的服务这两类。指令是由一个字节或者多个字节组成,其...
    99+
    2023-06-15
  • 为什么Vista中所有的.exe可执行程序都无法运行
    本篇内容介绍了“为什么Vista中所有的.exe可执行程序都无法运行”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前几天,论坛有用户反映Vi...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作