Go多线程与延迟执行

2023-04-27 15:25:50 浏览数 (1)

多线程

Go语言天生支持多线程编程,Go语言的goroutine是一种轻量级线程实现,可以在同一个进程中并发执行多个任务,同时又能保证数据安全。

启动一个goroutine很简单,只需要在函数前加上关键字go,就可以让这个函数在一个新的goroutine中运行。下面是一个简单的例子:

代码语言:javascript复制
func main() {
    go func() {
        fmt.Println("Hello from a goroutine")
    }()
    fmt.Println("Hello from main")
}

上面的代码会输出:

代码语言:javascript复制
Hello from main
Hello from a goroutine

注意到输出的顺序可能不是按照代码的顺序来的,因为两个goroutine是并发执行的。

Go语言还提供了一些同步机制,如channel、锁等,来保证多个goroutine之间的协调和同步。这些机制在多线程编程中非常重要,可以避免数据竞争等问题,保证程序的正确性和可靠性。

延迟执行

在Go语言中,可以使用时间.After和定时器来延迟执行函数。

时间.After会在指定时间后发送当前时间到返回的channel中,我们可以使用它来延迟执行函数:

代码语言:javascript复制
go func() {
    time.After(5 * time.Second)
    sayHello()
}()

5秒后,会在新的goroutine中调用sayHello函数。

使用定时器,我们可以重复延迟执行函数:

代码语言:javascript复制
timer := time.NewTimer(5 * time.Second)
go func() {
    for {
        <-timer.C
        sayHello()
        timer.Reset(5 * time.Second)
    }
}()

定时器的C channel会在定时时间后发送当前时间,我们通过channel接收时间,执行函数,然后重置定时器,这样就实现了重复延迟执行。

另外,我们也可以使用time.Tick实现重复延迟:

代码语言:javascript复制
ticker := time.NewTicker(5 * time.Second)
go func() {
    for t := range ticker.C {
        sayHello()
    }
}()

time.Tick会每隔一定时间就发送当前时间到返回的channel中。

综上,Go语言提供了三种延迟执行函数的方法:

  1. time.After: 单次延迟,在指定时间后执行函数
  2. 定时器:可以重复延迟执行函数
  3. time.Tick: 可以按固定时间间隔重复执行函数使用这些方法,我们可以在Go语言中实现各种延迟调度和定时任务。

0 人点赞