go的select:实现go常驻进程(守护进程)
博客专区 > 爬墙 的博客 > 博客详情
go的select:实现go常驻进程(守护进程)
爬墙 发表于2年前
go的select:实现go常驻进程(守护进程)
  • 发表于 2年前
  • 阅读 447
  • 收藏 4
  • 点赞 3
  • 评论 0

标题:腾讯云 新注册用户域名抢购1元起>>>   

今天写了个爬虫程序,想让其10分钟爬一次,找了很多方案:

一、用计划任务crontab,设定10分钟执行一次,方便简单,但计划任务不会将爬虫程序执行的时间计划进去,弃之。

二、各种第三方守护进程程序,感觉还是太麻烦。

三、使用select阻塞达到了目的,见 https://www.v2ex.com/t/277439#reply14

for { 
    select { 
        case <-time.After(10 * time.Minute): 
        //todo 
    } 
}

下面学习一下select使用:

参考:

语法说明:https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/14.4.md

http://eleme.io/blog/2014/goroutine-3/

http://yanyiwu.com/work/2014/11/08/golang-select-typical-usage.html


关键性理解:

select 就是监听 IO 操作,当 IO 操作发生时,触发相应的动作(每个case即是监听一个信道,注意是IO,也就是写入和读出信道都会返回true),否则就堵塞当前程序等待IO操作。select会尝试执行各个case, 如果都可以执行,那么随机选一个执行。


两个例子加深理解:

//计时器

package main

import (
       "fmt"
       "time"
)


func timer(duration time.Duration) chan bool {
       ch := make(chan bool)

       go func() {
              time.Sleep(duration)
              ch <- true // 到时间啦!
       }()

       return ch
}

func main() {
       timeout := timer(time.Second) // 定时1s

       for {
              select {
              case <- timeout:
                     fmt.Println("already 1s!") // 到时间
                     return  //结束程序
              }
       }
}
//超时退出
timeout := make (chan bool, 1)
go func() {
    time.Sleep(1e9) // sleep one second
    timeout <- true
}()
    ch := make (chan int)select {case <- ch:case <- timeout:
    fmt.Println("timeout!")
}
标签: go select
共有 人打赏支持
粉丝 11
博文 158
码字总数 65159
评论 (0)
×
爬墙
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: