场景

爬虫业务场景,我们需要调用三方接口获取代理ip地址,每个ip地址可以使用的时间有限和价格的,本着不浪费资源,我们在这里做一层封装。

当有其他业务调用我们接口的时候,会拉起定时任务,这个定时任务的生命周期为5分钟,超过5分钟这个定时任务就会停止,每一次请求时都会更新定时生命周期。这样既保证其他业务调用时能及时拿到代理ip地址,空闲时间又不浪费资源。

代码实现

package main

import (
"github.com/gin-gonic/gin"
"github.com/robfig/cron/v3"
"net/http"
"sync"
"time"
) type TaskManager struct {
cron *cron.Cron
entryID cron.EntryID
running bool
lifecycle int
lifecycleMux sync.Mutex
lifecycleTick *time.Ticker
stopChan chan struct{}
} func NewTaskManager() *TaskManager {
return &TaskManager{
cron: cron.New(cron.WithSeconds()),
running: false,
stopChan: make(chan struct{}),
}
} func (tm *TaskManager) StartTask() {
tm.lifecycleMux.Lock()
defer tm.lifecycleMux.Unlock() if tm.running {
tm.lifecycle = 5
return
} // 启动定时任务,每分钟执行一次
tm.entryID, _ = tm.cron.AddFunc("@every 1m", tm.task)
tm.cron.Start()
tm.running = true
tm.lifecycle = 5 // 启动生命周期ticker,每分钟递减一次
tm.lifecycleTick = time.NewTicker(1 * time.Minute)
go tm.lifecycleManager()
} func (tm *TaskManager) StopTask() {
tm.lifecycleMux.Lock()
defer tm.lifecycleMux.Unlock() if tm.running {
tm.cron.Remove(tm.entryID)
tm.lifecycleTick.Stop()
close(tm.stopChan)
tm.running = false
println("Task has stopped")
}
} func (tm *TaskManager) lifecycleManager() {
for {
select {
case <-tm.lifecycleTick.C:
tm.updateLifecycle()
case <-tm.stopChan:
return
}
}
} func (tm *TaskManager) updateLifecycle() {
tm.lifecycleMux.Lock()
defer tm.lifecycleMux.Unlock() tm.lifecycle--
if tm.lifecycle <= 0 {
tm.StopTask()
}
} func (tm *TaskManager) task() {
// 这里编写定时任务要执行的逻辑
println("Task is running")
} var taskManager = NewTaskManager() func main() {
r := gin.Default() // 定义请求处理函数
r.GET("/v1/ip", handleRequest) r.Run(":8080")
} func handleRequest(c *gin.Context) {
taskManager.StartTask() c.JSON(http.StatusOK, gin.H{
"message": "Task lifecycle updated",
})
}

注意: 获取的ip地址放到redis里设置过期时间。代码只共参考大体逻辑,具体实现需要修改。

golang 接口按需获取资源的更多相关文章

  1. Spring Resource接口获取资源

    1.1.1. Resource简介 在Spring内部实现机制,针对于资源文件(配置的xml文件)有一个统一的接口Resource. 1.1.1.1. 接口定义的方法 1.exists():判断资源文 ...

  2. 通过Spring Resource接口获取资源

    目录 1       Resource简介 2       通过ResourceLoader获取资源 3       在bean中获取Resource的方式 1       Resource简介 在S ...

  3. org.reflections 接口通过反射获取实现类源码研究

    org.reflections 接口通过反射获取实现类源码研究 版本 org.reflections reflections 0.9.12 Reflections通过扫描classpath,索引元数据 ...

  4. java之获取资源文件

    背景介绍 在java程序中有时我们需要加载项目中的某些资源文件(如:config.properties之类),以便获取里面的值,这样可以避免某些需要经常修改的数据硬编码入业务程序中 实现方式 实现这种 ...

  5. 【Golang 接口自动化06】微信支付md5签名计算及其优化

    前言 可能看过我博客的朋友知道我主要是做的支付这一块的测试工作.而我们都知道现在比较流行的支付方式就是微信支付和支付宝支付,当然最近在使用低手续费大力推广的京东金融(已改名为京东数科)以后也可能站到第 ...

  6. 【前端_js】前端跨网络异步获取资源——fetch()

    Fetch API 提供了一个 JavaScript接口,用于访问和操纵HTTP管道的部分,例如请求和响应.它还提供了一个全局 fetch()方法,该方法提供了一种简单,合理的方式来跨网络异步获取资源 ...

  7. Golang 接口与反射知识要点

    目录 Golang 接口与反射知识要点 1. 接口类型变量 2. 类型断言 3. 鸭子类型 4. 反射机制 5. reflect 包 TypeOf().ValueOf() Type().Kind() ...

  8. Golang 接口

    1 接口是什么 Golang中没有像Python.Java拥有类和对象的概念,其封装对象或说明对象是通过接口来实现的.比如谁能够实现什么样的功能,便能够将其抽象化封装. 接口定义了一组方法(抽象方法集 ...

  9. Servlet技术之——概述、实现、细节、获取资源、ServletConfig、ServletContext

    Servlet概述.实现.细节.获取资源.ServletConfig.ServletContext (一) Setvlet基本概述 (1) 什么是Servlet ? Servlet(Server Ap ...

  10. 【Spring】获取资源文件+从File+从InputStream对象获取正文数据

    1.获取资源文件或者获取文本文件等,可以通过Spring的Resource的方式获取 2.仅有File对象即可获取正文数据 3.仅有InputStream即可获取正文数据 package com.sx ...

随机推荐

  1. Arduino 语法--语句

    一.条件判断语句 Arduino 语言基于C和C++,有过开发经验的都知道,C语言中有一些内建指令,这些内建指令中有很重要的几个语句经常用到,这里介绍常用的条件判断语句if和else. if语句 在考 ...

  2. ffmpeg-5.0-essentials_build 下载

    ffmpeg-5.0-essentials_build下载放到蓝奏里了 https://wwz.lanzoub.com/if9xq02pttkb密码:ee8i

  3. 摸鱼日历,新闻简报等一些工作摸鱼日历API接口合集分享

    摸鱼人日历API接口 请求示例(图片输出): https://moyu.qqsuu.cn 请求示例(JSON输出):[推荐] https://moyu.qqsuu.cn/?type=json 调用示例 ...

  4. 墨者学院SQL注入(MySQL)的总结:

    ​ 我们打开靶机 ​ 在这个界面我们可以看见在密码的下面有一个停机公告,我们点进去,会发现可以发现这个公告是存在id的,又可以会出现漏洞.所以我们尝试着在id=1的后面加上and 1=1 ​ 我们可以 ...

  5. 视频笔记软件JumpVideo技术解析一:Electron案例-调用VLC播放器

    大家好,我是TheGodOfKing,是 最强考研学习神器,免费视频笔记应用JumpVideo,可以快速添加截图时间戳,支持所有笔记软件,学习效率MAX!的开发者之一,分享技术的目的是想找到更多志同道 ...

  6. 记录使用wsl环境nginx代理超时的处理方法

    有问题的配置 set $webpack_server http://127.0.0.1:3030; location ~ ^/static-dist { proxy_pass $webpack_ser ...

  7. 池化层 Pooling Layer

    写在前面:人生就是努力.搞不懂.躺平,循环. 文章结构 池化层的相对位置 在多通道任务中,池化层和卷积层的不同 重要的参数stride 与 kernel_size 大小的相对关系决定3种池化层 参数 ...

  8. python 更新pip镜像源

    前言 默认情况下 pip 使用的是国外的镜像,在下载的时候速度非常慢,下载速度是几kb或者几十kb,花费的时间比较长. 解决办法 国内目前有些机构或者公司整理了对应的镜像源,使得通过内网就能访问即可, ...

  9. Linux下对LVM逻辑卷分区大小调整 [针对xfs和ext4文件系统]

    当我们在安装系统的时候,由于没有合理分配分区空间,在后续维护过程中,发现有些分区空间不够使用,而有的分区空间却有很多剩余空间.如果这些分区在装系统的时候使用了lvm(前提是这些分区要是lvm逻辑卷分区 ...

  10. [框架应用系列:Quartz快速上手] Java定时任务解决方案之Quartz集群

    Quartz 是一个开源的作业调度框架,它完全由 Java 写成,并设计用于 J2SE 和 J2EE 应用中.它提供了巨大的灵 活性而不牺牲简单性.你能够用它来为执行一个作业而创建简单的或复杂的调度. ...