Go

Go 知识量:6 - 35 - 115

6.2 延时任务系统><

定时器- 6.2.1 -

在Go语言中,可以使用time包来创建和管理定时器。time包提供了一系列的函数和类型,用于处理时间和日期的相关操作。

下面是一个使用定时器的简单示例:

package main  
  
import (  
 "fmt"  
 "time"  
)  
  
func main() {  
 // 创建一个定时器,每隔1秒触发一次  
 timer := time.NewTimer(1 * time.Second)  
  
 // 等待定时器触发  
 <-timer.C  
 fmt.Println("Timer fired!")  
}

在上面的示例中,使用time.NewTimer函数创建了一个定时器,并指定了每隔1秒触发一次。然后,通过从定时器的C通道接收值来等待定时器的触发。当定时器触发时,会打印出"Timer fired!"。

任务分发- 6.2.2 -

在Go语言中,可以使用goroutine和channel来实现任务分发。

Goroutine是Go语言中的轻量级线程实现,由Go运行时(runtime)管理。Go程序会智能地将goroutine中的任务合理地分配给每个CPU。通过使用关键字go,可以为函数创建一个goroutine。一个函数可以被创建多个goroutine,一个goroutine必定对应一个函数。

Channel是用于在goroutine之间进行通信和同步的信道。通过使用channel,可以将任务发送到另一个goroutine中执行,并等待其完成。以下是一个简单的示例,演示了如何使用goroutine和channel进行任务分发:

package main  
  
import (  
 "fmt"  
 "time"  
)  
  
func worker(id int, jobs <-chan int, results chan<- int) {  
 for j := range jobs {  
 fmt.Println("Worker", id, "started job", j)  
 time.Sleep(time.Second) // 模拟耗时任务  
 fmt.Println("Worker", id, "finished job", j)  
 results <- j * 2 // 将任务结果发送到结果通道  
 }  
}  
  
func main() {  
 // 创建任务通道和结果通道  
 jobs := make(chan int, 100)  
 results := make(chan int, 100)  
  
 // 启动3个worker goroutine  
 for w := 1; w <= 3; w++ {  
 go worker(w, jobs, results)  
 }  
  
 // 发送任务到任务通道  
 for j := 1; j <= 9; j++ {  
 jobs <- j  
 }  
 close(jobs) // 关闭任务通道,表示没有更多的任务了  
  
 // 收集结果  
 for a := 1; a <= 9; a++ {  
 <-results // 从结果通道接收结果,如果没有结果则阻塞等待  
 }  
}

在上面的示例中,创建了两个通道:jobs用于发送任务,results用于接收任务结果。然后,启动了3个worker goroutine,它们从jobs通道中获取任务并执行,然后将结果发送到results通道中。在main函数中,循环发送任务到jobs通道,并在每次发送后关闭通道。然后,循环从results通道接收结果,如果没有结果则阻塞等待。这样,任务就被分发给了多个worker goroutine并行执行,并最终收集到了所有的结果。