golang 接口按需获取资源
场景
爬虫业务场景,我们需要调用三方接口获取代理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 接口按需获取资源的更多相关文章
- Spring Resource接口获取资源
1.1.1. Resource简介 在Spring内部实现机制,针对于资源文件(配置的xml文件)有一个统一的接口Resource. 1.1.1.1. 接口定义的方法 1.exists():判断资源文 ...
- 通过Spring Resource接口获取资源
目录 1 Resource简介 2 通过ResourceLoader获取资源 3 在bean中获取Resource的方式 1 Resource简介 在S ...
- org.reflections 接口通过反射获取实现类源码研究
org.reflections 接口通过反射获取实现类源码研究 版本 org.reflections reflections 0.9.12 Reflections通过扫描classpath,索引元数据 ...
- java之获取资源文件
背景介绍 在java程序中有时我们需要加载项目中的某些资源文件(如:config.properties之类),以便获取里面的值,这样可以避免某些需要经常修改的数据硬编码入业务程序中 实现方式 实现这种 ...
- 【Golang 接口自动化06】微信支付md5签名计算及其优化
前言 可能看过我博客的朋友知道我主要是做的支付这一块的测试工作.而我们都知道现在比较流行的支付方式就是微信支付和支付宝支付,当然最近在使用低手续费大力推广的京东金融(已改名为京东数科)以后也可能站到第 ...
- 【前端_js】前端跨网络异步获取资源——fetch()
Fetch API 提供了一个 JavaScript接口,用于访问和操纵HTTP管道的部分,例如请求和响应.它还提供了一个全局 fetch()方法,该方法提供了一种简单,合理的方式来跨网络异步获取资源 ...
- Golang 接口与反射知识要点
目录 Golang 接口与反射知识要点 1. 接口类型变量 2. 类型断言 3. 鸭子类型 4. 反射机制 5. reflect 包 TypeOf().ValueOf() Type().Kind() ...
- Golang 接口
1 接口是什么 Golang中没有像Python.Java拥有类和对象的概念,其封装对象或说明对象是通过接口来实现的.比如谁能够实现什么样的功能,便能够将其抽象化封装. 接口定义了一组方法(抽象方法集 ...
- Servlet技术之——概述、实现、细节、获取资源、ServletConfig、ServletContext
Servlet概述.实现.细节.获取资源.ServletConfig.ServletContext (一) Setvlet基本概述 (1) 什么是Servlet ? Servlet(Server Ap ...
- 【Spring】获取资源文件+从File+从InputStream对象获取正文数据
1.获取资源文件或者获取文本文件等,可以通过Spring的Resource的方式获取 2.仅有File对象即可获取正文数据 3.仅有InputStream即可获取正文数据 package com.sx ...
随机推荐
- 福尼斯焊机TPS320i/TPS400i/TPS500i的焊接特性
福尼斯焊机设备原理 TPS320i.TPS400i.TPS500i和TPS 600iMIG/MAG电源由微处理器控制,机器人驱动器维修,是完全数字化的逆变器电源. 模块化设计和系统的扩展潜力使其具有高 ...
- AD22 PCB导出Gerber文件详细步骤
PCB绘制好,检查完成后,就可以把文件交给PCB工厂生产了,一般有两种方式: 第一种最简单就是直接将PCB文件压缩打包,发给工厂. 第二种生成Gerber等相关资料,再压缩打包,发给工厂. 这里以AD ...
- Ansible - [11] Roles
前言 Q1:什么是Roles 在实际生产环境中,会编写大量的playbook文件来实现不同的功能.而且,每个playbook还可能会调用其他文件(变量文件),对于海量的.无规律的文件,管理是个问题.A ...
- Linux系统下nginx的安装与卸载
1.1 安装 准备依赖环境 1.安装 gcc 依赖库 yum install gcc-c++ 2.安装 PCRE pcre-devel 依赖库 yum install -y pcre pcre-dev ...
- Keepalived学习,双机主备高可用
一.主机安装 1.解压 tar -zxvf keepalived-2.0.18.tar.gz 2.解压后进入到解压出来的目录,看到会有configure,那么就可以做配置了 3.使用configure ...
- 零经验选手,Compose 一天开发一款小游戏!
猛男翻卡牌 猛男启动 继上一个 Compose 练习项目 SimpleTodo 之后,又尝试用 Compose 来做了一个翻牌记忆游戏[猛男翻卡牌].这次是零经验写游戏项目,连原型都没有做设计,问了 ...
- MinIO Linux 数据迁移
目录 安装 下载 安装Minio客户端 备份数据 数据还原 数据迁移 设置别名 迁移 从A服务器,迁移致B服务器,前提,需要两边的 Bucket 相同,如果B服务器没有A服务器里的 Bucket 需要 ...
- 如何通过 MCP 将你的 Supabase 数据库连接到 Cursor
Cursor + MCP + Supabase. 图片来自作者 在过去几周里,MCP(Model Context Protocol,模型上下文协议)在许多 AI 相关的在线社区和论坛里大火.开发者和技 ...
- Joker 全栈低代码智能开发平台:开启高效开发新时代
低代码开发技术凭借其独特优势,正逐渐成为软件开发领域的关键力量.Gartner 预测,到 2025 年,全球 70% 的新应用将采用低代码 / 无代码技术.Forrester 报告显示,中国低代码市场 ...
- centos7 docker卸载老版本并升级到最新稳定版本
一.前言 docker的版本分为社区版docker-ce和企业版dokcer-ee社,区版是免费提供给个人开发者和小型团体使用的,企业版会提供额外的收费服务,比如经过官方测试认证过的基础设施.容器.插 ...