登录
首页 >  Golang >  Go问答

中断睡眠模式以防止应用程序关闭

来源:stackoverflow

时间:2024-02-21 09:00:26 384浏览 收藏

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

问题内容

我有一个简单的 golang 应用程序,在特定条件下可以完成一些工作。如果不满足条件,则应用程序将进入睡眠状态。

func main() {

    ctx, cancel := context.WithCancel(context.Background())
    defer cancel()
    go func() {
        for {
            select {
            case <-ctx.Done():
                break
            default:
                if condition {
                    //do something
                } else {
                    time.Sleep(1 * time.Minute)
                }
            }

        }
    }()
    signChan := make(chan os.Signal, 5)
    signal.Notify(signChan, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
    <-signChan
    cancel() 
    time.Sleep(3 * time.Second)
    fmt.Println("Shutdown")
}

如何在应用程序关闭时中断睡眠?


正确答案


for {
            select {
            case <-ctx.done():
                break
            default:
                if condition {
                    //do something
                } else {
                    time.sleep(1 * time.minute)
                }
            }
        }

由于您在 default 情况下调用 time.sleep,因此 ctx.done() 无法取消它。

相反,请使用 (time.after)[https://pkg.go.dev/time#after],它会返回一个通道,当计时器到期时,您将收到 time.time 。这样,您将拥有 2 个通道,而不是默认情况,并且可以从先到者中选择 选择

Here is a working example

package main

import (
    "context"
    "fmt"
    "sync"
    "time"
)

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    defer cancel()
    var wg sync.WaitGroup
    wg.Add(1)
    go func() {
        defer wg.Done()
        defer fmt.Println("Worker shutdown")
        for {
            select {
            case <-ctx.Done():
                return
            case <-time.After(1 * time.Second):
                fmt.Println("check for work")
            }
        }
    }()
    time.Sleep(3 * time.Second)
    cancel()
    wg.Wait()
    fmt.Println("Shutdown")
}

我还对这个示例进行了一些修改,使其更符合人体工程学:

  • 为了能够进行演示,取消了中断并用睡眠代替。在现实生活中,中断可以调用 cancel()
  • 为了确保关闭时工作协程已完成,添加了 sync.waitgroup 以便主线程可以等待它。

今天关于《中断睡眠模式以防止应用程序关闭》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>