场景

爬虫业务场景,我们需要调用三方接口获取代理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. 【java】对list集合进行去重 传统方式 VS Lambda

    说道集合的去重,我们就肯定能想到唯一元素集合set,还有map中的key.那么我们传统的去重的方式肯定是要选择set或者是map来实现了,另外在对实体对象类型进行去重的时候,我们可能会指定实体中的一个 ...

  2. 微信小程序之java服务端获取openid

    微信小程序越来越热,最近团队写了一个小程序,这篇博客我将讲一下怎么通过java服务端获取到用户的openid. api文档的授权登陆地址: http://developers.weixin.qq.co ...

  3. Flink - [07] 容错机制

    题记部分 一.一致性检查点   Flink故障恢复机制的核心,就是应用状态的一致性检查点.有状态流应用的一致性检查点,其实就是所有任务的状态,在某个时间点的一份拷贝(一份快照):这个时间点,应该是所有 ...

  4. 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)

    #div_digg { float: right; font-size: 12px; margin: 10px; text-align: center; width: 120px; position: ...

  5. pnpm:无法加载文件 C:\Users\Five\AppData\Roaming\npm\pnpm.ps1 ,因为在此系统上禁止运行脚本

    前言 重装完了电脑系统,运行pnpm 无法加载文件,pnpm -V也不行 解决方案 用管理员方式启动power shell 输入命令:set-ExecutionPolicy RemoteSigned ...

  6. pandas如何处理跳过表头操作

    1.打印前5行数据,发现存在'NAN' 2.如果这个问题不处理,后续要到操作列时,会报错误''DataFrame' object is not callable' 思路: 跳过有NAN的行 def t ...

  7. [tldr]github仓库添加release

    作为一个开源项目开发者,并且把自己的代码仓库托管到了github上面,所以,可以在github上提供自己的程序的release 这通常是通过二进制可执行文件的方式提供 新建草稿 点击create a ...

  8. ssh WARNING: UNPROTECTED PRIVATE KEY FILE!

    前言 在 ssh -i 指定密钥文件 登录时,出现以下报错: Permissions 0644 for 'xxxx' are too open. It is required that your pr ...

  9. PIL或Pillow学习1

    PIL( Python Imaging Library)是 Python 的第三方图像处理库,由于其功能丰富,API 简洁易用,因此深受好评. 自 2011 年以来,由于 PIL 库更新缓慢,目前仅支 ...

  10. MFC非模态对话框的关闭

    如果要在点击按钮的情况下,销毁非模态对话框,只需要把按钮的事件映射到OnCancel函数, 里面调用DestroyWindow(), 然后重写PostNCDestroy(), delete 指针. 另 ...