当前位置: 首页>>编程示例 >>用法及示例精选 >>正文


GO NotifyContext用法及代码示例

GO语言"os/signal"包中"NotifyContext"函数的用法及代码示例。

用法:

func NotifyContext(parent context.Context, signals ...os.Signal)(ctx context.Context, stop context.CancelFunc)

NotifyContext 当列出的信号之一到达、调用返回的停止函数或父上下文的 Done 通道关闭时(以先发生者为准),返回标记为完成的父上下文的副本(其 Done 通道已关闭) .

stop 函数取消注册信号行为,就像 signal.Reset 一样,可以恢复给定信号的默认行为。例如,接收 os.Interrupt 的 Go 程序的默认行为是退出。调用 NotifyContext(parent, os.Interrupt) 将改变行为以取消返回的上下文。在调用返回的停止函数之前,接收到的未来中断不会触发默认(退出)行为。

stop 函数释放与其关联的资源,因此代码应该在此上下文中运行的操作完成后立即调用 stop,并且不再需要将信号转移到上下文中。

例子:

这个例子传递一个带有信号的上下文来告诉阻塞函数它应该在收到信号后放弃它的工作。

package main

import (
    "context"
    "fmt"
    "log"
    "os"
    "os/signal"
    "time"
)

func main() {
    ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)
    defer stop()

    p, err := os.FindProcess(os.Getpid())
    if err != nil {
        log.Fatal(err)
    }

    // On a Unix-like system, pressing Ctrl+C on a keyboard sends a
    // SIGINT signal to the process of the program in execution.
    //
    // This example simulates that by sending a SIGINT signal to itself.
    if err := p.Signal(os.Interrupt); err != nil {
        log.Fatal(err)
    }

    select {
    case <-time.After(time.Second):
        fmt.Println("missed signal")
    case <-ctx.Done():
        fmt.Println(ctx.Err()) // prints "context canceled"
        stop()                 // stop receiving signal notifications as soon as possible.
    }

}

输出:

context canceled

相关用法


注:本文由纯净天空筛选整理自golang.google.cn大神的英文原创作品 NotifyContext。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。