- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
学习Go语⾔必备案例(4)
31.定时器
我们常常需要在后⾯⼀个时刻运⾏ Go 代码,或者在某段时间间隔内重复运⾏。Go 的内置 定时器 和 打点器 特性让这些很容易实现。
package main
import (
"fmt"
"time"
)
func main() {
定时器表⽰在未来某⼀时刻的独⽴事件。
//
你告诉定时器需要等待的时间,然后它将提供⼀个⽤于通知的通道。
//
这⾥的定时器将等待 秒。
// 2
timer1 := time.NewTimer(time.Second * 2)
直到这个定时器的通道 明确的发送了定时器失效的值之前,将⼀直阻塞。
//<-timer1.C C
<-timer1.C
fmt.Println("Timer 1 expired")
如果你需要的仅仅是单纯的等待,你需要使⽤ 。
// time.Sleep
定时器是有⽤原因之⼀就是你可以在定时器失效之前,取消这个定时器。
//
timer2 := time.NewTimer(time.Second)
go func() {
<-timer2.C
fmt.Println("Timer 2 expired")
}()
stop2 := timer2.Stop()
if stop2 {
fmt.Println("Timer 2 stopped")
}
}
执⾏结果如下图所⽰:
第⼀个定时器将在程序开始后 ~2s 失效,但是第⼆个在它没失效之前就停⽌了。
32.打点器
定时器 是当你想要在未来某⼀刻执⾏⼀次时使⽤的 - 打点器 则是当你想要在固定的时间间隔重复执⾏准备的。这⾥是⼀个打点器的例⼦,
它将定时的执⾏,直到我们将它停⽌。
package main
import (
"fmt"
"time"
)
func main() {
打点器和定时器的机制有点相似:⼀个通道⽤来发送数据。
//
这⾥我们在这个通道上使⽤内置的 来迭代值每隔 发送⼀次的值。
// range 500ms
ticker := time.NewTicker(time.Millisecond * 500)
go func() {
for t := range ticker .C {
fmt.Println("Tick at", t)
}
}()
打点器可以和定时器⼀样被停⽌。⼀旦⼀个打点停⽌了,将不能再从它的通道中接收到值。
//
我们将在运⾏后 停⽌这个打点器。
// 1600ms
time.Sleep(time.Millisecond * 1600)
ticker .Stop()
fmt.Println("Ticker stopped")
}
执⾏结果如下图所⽰:
当我们运⾏这个程序时,这个打点器会在我们停⽌它前打点3次。
33.⼯作池
在这个例⼦中,我们将看到如何使⽤ Go 协程和通道实现⼀个⼯作池 。
package main
import (
"fmt"
"time"
)
这是我们将要在多个并发实例中⽀持的任务了。
//
这些执⾏者将从 通道接收任务,并且通过 发送对应的结果。
// jobs results
我们将让每个任务间隔 来模仿⼀个耗时的任务。
// 1s
func worker(id int, jobs <-chan int, results chan<- int) {
for j := range jobs {
fmt.Println("worker",
文档评论(0)