文档章节

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

爬墙
 爬墙
发布于 2016/05/10 00:08
字数 347
阅读 529
收藏 4
点赞 3
评论 0

今天写了个爬虫程序,想让其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
博文 158
码字总数 68221
作品 0
美国
golang以服务方式运行

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

Minho ⋅ 2016/07/13 ⋅ 2

pantian/PtWebserver

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

pantian ⋅ 2015/06/12 ⋅ 0

介绍守护进程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 ⋅ 0

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

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

金三胖 ⋅ 2015/08/01 ⋅ 1

常驻内存型 PHP 框架--easySwoole

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

easySwoole ⋅ 2017/11/07 ⋅ 1

Spark部署与job运行

部署图 整个集群分为 Master 节点和 Worker 节点,相当于 Hadoop 的 Master 和 Slave 节点。 Master 节点上常驻 Master 守护进程,负责管理全部的 Worker 节点。 Worker 节点上常驻 Worker 守...

ccj_ok ⋅ 2017/05/27 ⋅ 0

Linux查找是发送SIGKILL信号的进程

背景 最近在开发服务器上遇到了一件奇怪的事情,同事反馈之前运行着正常的程序,现在现在运行一段时间会退出,而且没有日志输出。询问后,出现这个现象是在周末由于停电重启之后。 停电重启?...

himayan46 ⋅ 01/12 ⋅ 0

linux/unix的ipc能实现进程间传递文件描述符吗

最近搞个转发项目,但是服务端的并发性能优点瓶颈,在想办法来优化服务端的代码。初步设想改进方法如下: 整体方案:后台常驻进程2个;进程pro1负责监听,进程pro2负责具体转发工作 进程分工...

hacker_cgh ⋅ 2014/08/30 ⋅ 2

应用保活终极总结(二):Android6.0及以上的保活实践(进程防杀篇)

原作者:“裂缝中的阳光dg”,本文现已重新修订并整理发布,感谢原作者的无私分享。 1、前言 在Android 4.4及以后的系统中,应用能否常驻内存,一直以来都是相当头疼的事情,尤其移动端IM、消...

JackJiang2011 ⋅ 2017/10/20 ⋅ 0

Linux进程相关的内容及命令小结(一)

概念:进程,一个活动的程序实体的副本,拥有生命周期,一个进程可能包含一个或多个执行流; 进程的创建进程: 每个进程的组织结构是一致的; 内核在正常启动并且全面接管硬件资源之后,会创...

付博元 ⋅ 2017/07/24 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Centos7重置Mysql 8.0.1 root 密码

问题产生背景: 安装完 最新版的 mysql8.0.1后忘记了密码,向重置root密码;找了网上好多资料都不尽相同,根据自己的问题总结如下: 第一步:修改配置文件免密码登录mysql vim /etc/my.cnf 1...

豆花饭烧土豆 ⋅ 今天 ⋅ 0

熊掌号收录比例对于网站原创数据排名的影响[图]

从去年下半年开始,我在写博客了,因为我觉得业余写写博客也还是很不错的,但是从2017年下半年开始,百度已经推出了原创保护功能和熊掌号平台,为此,我也提交了不少以前的老数据,而这些历史...

原创小博客 ⋅ 今天 ⋅ 0

LVM讲解、磁盘故障小案例

LVM LVM就是动态卷管理,可以将多个硬盘和硬盘分区做成一个逻辑卷,并把这个逻辑卷作为一个整体来统一管理,动态对分区进行扩缩空间大小,安全快捷方便管理。 1.新建分区,更改类型为8e 即L...

蛋黄Yolks ⋅ 今天 ⋅ 0

Hadoop Yarn调度器的选择和使用

一、引言 Yarn在Hadoop的生态系统中担任了资源管理和任务调度的角色。在讨论其构造器之前先简单了解一下Yarn的架构。 上图是Yarn的基本架构,其中ResourceManager是整个架构的核心组件,它负...

p柯西 ⋅ 今天 ⋅ 0

uWSGI + Django @ Ubuntu

创建 Django App Project 创建后, 可以看到路径下有一个wsgi.py的问题 uWSGI运行 直接命令行运行 利用如下命令, 可直接访问 uwsgi --http :8080 --wsgi-file dj/wsgi.py 配置文件 & 运行 [u...

袁祾 ⋅ 今天 ⋅ 0

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

推荐:并发情况下:Java HashMap 形成死循环的原因

在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历...

码代码的小司机 ⋅ 昨天 ⋅ 2

聊聊spring cloud gateway的RetryGatewayFilter

序 本文主要研究一下spring cloud gateway的RetryGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gateway/config/G......

go4it ⋅ 昨天 ⋅ 0

创建新用户和授予MySQL中的权限教程

导读 MySQL是一个开源数据库管理软件,可帮助用户存储,组织和以后检索数据。 它有多种选项来授予特定用户在表和数据库中的细微的权限 - 本教程将简要介绍一些选项。 如何创建新用户 在MySQL...

问题终结者 ⋅ 昨天 ⋅ 0

android -------- 颜色的半透明效果配置

最近有朋友问我 Android 背景颜色的半透明效果配置,我网上看资料,总结了一下, 开发中也是常常遇到的,所以来写篇博客 常用的颜色值格式有: RGB ARGB RRGGBB AARRGGBB 这4种 透明度 透明度...

切切歆语 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部