文档章节

go的select:实现go常驻进程(守护进程)

爬墙
 爬墙
发布于 2016/05/10 00:08
字数 347
阅读 632
收藏 4

今天写了个爬虫程序,想让其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!")
}

© 著作权归作者所有

共有 人打赏支持
爬墙
粉丝 11
博文 334
码字总数 74580
作品 0
美国
golang以服务方式运行

golang开发的二进制程序,一般需要长期后台运行的,在linux上可以用supervisor或upstart或systemd等第三方守护进程来实现。其实golang自己也可以实现以服务的形式常驻后台。 需要的库 https:...

Minho
2016/07/13
623
2
介绍守护进程XINETD与SOCKET程序的含义

2.一个简单的服务程序 goodie include include char *cmds[]={"help","say","hello","bye","exit",NULL}; int getcmd(char *cmd){int n=0;while (cmds[n]!=NULL) {if (strncasecmp(cmd,cmds[......

红薯
2009/05/07
305
0
pantian/PtWebserver

关于PTWebServer PTWebServer是一款基于php swoole扩展应用的web http服务器,应用程序可以常驻在内存,可以快速响应客户的请求。 交流QQ群:68832889 完整文档:http://www.haodocs.com/sh...

pantian
2015/06/12
0
0
用PHP实现守护进程任务后台运行与多线程(php-resque使用说明)

消息队列处理后台任务带来的问题 项目中经常会有后台运行任务的需求,比如发送邮件时,因为要连接邮件服务器,往往需要5-10秒甚至更长时间,如果能先给用户一个成功的提示信息,然后在后台慢...

金三胖
2015/08/01
0
1
常驻内存型 PHP 框架--easySwoole

EasySwoole 是一款基于Swoole Server 开发的常驻内存型PHP框架,专为API而生,摆脱传统PHP运行模式在进程唤起和文件加载上带来的性能损失。EasySwoole 高度封装了Swoole Server 而依旧维持S...

easySwoole
2017/11/07
437
1

没有更多内容

加载失败,请刷新页面

加载更多

gson1.7.1线程并发导致空指针问题

java.lang.NullPointerExceptionat com.google.gson.FieldAttributes.getAnnotationFromArray(FieldAttributes.java:231)at com.google.gson.FieldAttributes.getAnnotation(FieldAttribut......

东风125
37分钟前
1
0
以太坊RPC接口使用

以太坊RPC接口文档: https://github.com/ethereum/wiki/wiki/JSON-RPC#web3_clientversion 使用方式: 比如我要调用某个合约的balanceOf(address _owner)方法。 因为没有改变合约的状态,所以...

王坤charlie
今天
2
0
C#下的一个好用的日历库(sxtwl_cpp),支持农历转公历,和公历转农历等功能

sxtwl_cpp是寿星天文历的C++版本实现。支持多种语言的绑定 代码首页 懒人包 懒人包使用方法 1、右链工程中的引用-》添加引用-》浏览-》选中dotnet目录下的sxtwl.net.dll 2、生成解决方案-》找...

元谷
今天
1
0
C++基础知识

链接:https://zhuanlan.zhihu.com/p/38399566 本文主要提一下以下三个区别: 引用必须初始化,而指针可以不初始化。 我们在定义一个引用的时候必须为其指定一个初始值,但是指针却不需要。 ...

悲催的古灵武士
今天
1
0
Oracle备份脚本,保留10天数据

@echo off echo 删除10天前的备分文件和日志forfiles /p "D:\oracleback\backfile" /m *.dmp /d -10 /c "cmd /c del @path" forfiles /p "D:\oracleback\backfile" /m *.log /d -10......

lyle_luo
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部