Go 知识量:6 - 35 - 115
在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!"。
在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并行执行,并最终收集到了所有的结果。
Copyright © 2017-Now pnotes.cn. All Rights Reserved.
编程学习笔记 保留所有权利
MARK:3.0.0.20240214.P35
From 2017.2.6