学习Go语言必备案例(4)2379.pdf

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)

139****1921 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

认证主体姚**

1亿VIP精品文档

相关文档

相关课程推荐