文档章节

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

爬墙
 爬墙
发布于 2016/05/10 00:08
字数 347
阅读 725
收藏 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
博文 357
码字总数 87300
作品 0
美国
私信 提问
介绍守护进程XINETD与SOCKET程序的含义

  1.Xinetd提供被动式的超级服务,也就是服务程序是被使用端所启动,平时则无须存在。例如,ftp, telnetd, pop3,imap, auth等等,这些服务没有人使用时,无须启动。此外,xinetd将socket转...

红薯
2009/05/07
448
0
golang以服务方式运行

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

Minho
2016/07/13
623
2
pantian/PtWebserver

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

pantian
2015/06/12
0
0
常驻内存型 PHP 框架--easySwoole

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

easySwoole
2017/11/07
437
1
用PHP实现守护进程任务后台运行与多线程(php-resque使用说明)

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

金三胖
2015/08/01
0
1

没有更多内容

加载失败,请刷新页面

加载更多

对接比特币钱包的PHP开发包

BtcTool是一个基于第三方服务和离线裸交易实现的PHP比特币应用开发包,适合不希望部署本地 节点旳PHP开发者,开发包主要包含以下特性: 利用第三方服务获取指定地址的utxo集合 离线生成消费裸...

汇智网教程
9分钟前
0
0
【自用】 VHD to VHDX

VHDX: 在VHD 2TB 的基础上提供 64TB的容量。 支持逻辑扇区大小为 4KB,和每块的大小为 256MB,来优化虚拟磁盘性能。 比VHD提供更高的安全性、可靠性和性能。 convert-VHD –path d:\Hyper-v...

Tensor丨思悟
22分钟前
0
0
30 岁转行做Python开发晚吗?而且是零基础

最近有小伙伴问小编,30 岁转行做Python开发晚吗? 小编想说,其实无论男女,只要想学,有这个动力,就直接去行动。无论年龄,无论性别,只要你想一直勇往直前,那么想做的就去做吧~这里有一...

糖宝lsh
32分钟前
7
0
详解Spring中的Profile

前言 由于在项目中使用Maven打包部署的时候,经常由于配置参数过多(比如Nginx服务器的信息、ZooKeeper的信息、数据库连接、Redis服务器地址等),导致实际现网的配置参数与测试服务器参数混淆...

watermelon11
47分钟前
4
0
phper必知必会(二)

  1.说说你对进程,线程以及协程的理解      进程:是系统进行资源分配和调度的基本单位,是基本操作系统结构的基础。进程是程序基本执行的实体。进程与进程之间是独立的,拥有完全独立...

SEOwhywhy
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部