首页 > 其他分享 >golang 接口按需获取资源

golang 接口按需获取资源

时间:2024-07-11 18:30:26浏览次数:7  
标签:cron lifecycleMux 接口 TaskManager golang 获取 running tm func

场景

爬虫业务场景,我们需要调用三方接口获取代理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里设置过期时间。代码只共参考大体逻辑,具体实现需要修改。

标签:cron,lifecycleMux,接口,TaskManager,golang,获取,running,tm,func
From: https://www.cnblogs.com/xiaogongzi/p/18296703

相关文章

  • 快递查询|阿里云实现调用API接口
    整体请求流程介绍:本次解析通过阿里云云市场的云服务来实现程序中对快递包裹实时监控,首先需要准备选择一家可以提供快递查询的商品。https://market.aliyun.com/apimarket/detail/cmapi00065859#sku=yuncode5985900001步骤1:选择商品如图点击免费试用,即可免费申请该接......
  • Go语言---接口interface、接口转换、继承、类型查询
    接口(interface)概念在Go语言中,接口(interface)是一个自定义类型,接口类型具体描述了一系列方法的集合。接口又称为动态数据类型,在进行接口使用的的时候,会将接口对位置的动态类型改为所指向的类型,会将动态值改成所指向类型的结构体。接口可以让我们将不同的类型绑定到......
  • 使用python获取江苏省历年GDP#获取数据#爬虫程序#统计
    我们在搜索页面随机点开拥有数据的页面。www.shujujidi.com观察其所需数据的元素特点,编写代码frombs4importBeautifulSoupimportrequestsheaders={"User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/1......
  • 【java】实现sse调用websocket接口,忽略wss证书并控制sse吐字速度
    maven<dependency><groupId>org.java-websocket</groupId><artifactId>Java-WebSocket</artifactId><version>1.5.3</version></dependency>AsyncConfigpackag......
  • uniapp微信小程序获取定位
    一、需求在uniapp编写的微信小程序中获取到用户的定位(简单版)二、方法及使用时遇到的问题1、从微信开放文档中了解到微信小程序中获取用户的定位可以使用wx.getLocation2、直接使用文档中的示例代码,并在文件目录的 pages.json 中进行 requiredPrivateInfos 配置,再运行代码......
  • 高速接口:GT基础(一)
    参考:https://blog.csdn.net/m0_56222647/article/details/136730026一、GT是什么?参考链接:https://zhuanlan.zhihu.com/p/46052855它是集成在FPGA芯片内部的固定电路,因此我们只需要关心该固定电路与FPGA的逻辑部分接口时序即可;它是串行收发器,发送出去只有1bit数据,而接收端也......
  • golang sync.Pool 的基本原理
    sync.Pool包寥寥不过300行代码,却可以为我们提供类似对象池的功能,减少了对象的重复创建于销毁,减少了性能损耗,增加内存复用,同时自带mutex锁可以保证Put/Get操作的并发安全特性,在一些对象需要重复创建销毁的场景中很是实用,今天来看看sync.Pool的基本原理。sync.Pool就在标准......
  • 智能小程序 Ray 开发门锁 API ——用户 API 接口汇总
    获取当前登录用户信息getCurrentMemberInfo引入@ray-js/ray^1.5.0以上版本可使用import{getCurrentMemberInfo}from'@ray-js/ray'参数CurrentMemberInfoParams属性类型必填说明devIdstring是设备IDdpIdsstring是数据点ID返回CurrentMemberInfoResult属性类......
  • unity 用gps获取经纬度,然后将经纬度通过逆地理编码转换成中文地址(百度API)
    1.通过GPS获取经纬度直接上代码了usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;usingUnityEngine.UI;publicclassGetGPS:MonoBehaviour{stringGetGps="";//publicButtonupdateBtn;Vector2jingWei=newVe......
  • 推荐一款Python接口自动化测试数据提取分析神器!
    1、引言在处理JSON数据时,我们常常需要提取、筛选或者变换数据。手动编写这些操作的代码不仅繁琐,而且容易出错。Python作为一个功能强大的编程语言,拥有丰富的库和工具来处理这些数据。今天,将介绍一个实用的Python库——JMESPath,它为提取JSON数据提供了简洁而强大的语法。2、JMESP......