Golang Go语言中gin框架如何开启和停止任务

发布于 1周前 作者 eggper 来自 Go语言

Golang Go语言中gin框架如何开启和停止任务

有两个 API 接口,/v1/run/v1/stop

任务是多个的,根据 id 区分。

调用 /v1/run?id=1 任务 1 就会开始运行并处于运行状态。

因为任务是定期持续运行的类型,所以任务可能要用类似 gocron 之类的库,或者有个好的选择。

再调用 /v1/stop?id=1 就会停止。

还有就是 /v1/status?id=1 就能查看运行状态。

要如何实现呢?


更多关于Golang Go语言中gin框架如何开启和停止任务的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

17 回复

设置一个信号量,stop 修改信号量

更多关于Golang Go语言中gin框架如何开启和停止任务的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


最好依靠专门的队列来做吧。。

跟 gin 无关,要看接口里面的 handler 怎么实现,任务跑在哪的

暂停任务可以使用 context

这跟 gin 有啥关系…

这和 gin 没有关系,你不用 gin 不会实现的话,用 gin 你也一样不会实现

你需要一个监听器。

嗯,不用 gin 知道怎么做,但是得加到 gin 上去,会吗?

4 楼说对了,早两年就有出了外部控制协程的官方库了,context


谢谢,研究下。

可以这样做 任务运行的时候穿进去 ctx 然后保存这个 ctx 对应的 cancelFunc 和任务名称保存在一个 map 中 map 是全局变量,然后停止的时候从 map 中取出任务对应的 cancelFunc 执行就可以了

谢谢,要的就是这个。

https://github.com/robfig/cron
github.com/jakecoffman/cron
看看这两个能满足吗,后者再前者上封装了删除任务的方法

这 API 设计的很有趣,跟函数名有异曲同工之妙

这确实跟 gin 没关系,你的问题其实应该是如何持久化存储状态

在Golang中使用Gin框架时,管理和控制任务的启动与停止通常不是Gin框架本身直接提供的功能,而是需要通过其他方式来实现,比如使用goroutine和同步机制(如channel或sync包中的工具)。以下是一个基本的思路:

  1. 启动任务

    • 你可以在一个goroutine中启动你的任务。这通常涉及到启动一个无限循环,或者使用某种形式的轮询机制来定期检查或执行任务。
    • 使用一个全局变量或结构体来管理任务的状态(如运行、停止)。
  2. 停止任务

    • 通过channel发送信号来通知goroutine停止任务。
    • 在goroutine中监听这个channel,一旦接收到停止信号,则安全地退出循环或清理资源。

示例代码片段:

package main

import (
    "fmt"
    "time"
)

var stopChan = make(chan bool)

func runTask() {
    for {
        select {
        case <-stopChan:
            fmt.Println("Task stopped")
            return
        default:
            fmt.Println("Task running")
            time.Sleep(1 * time.Second)
        }
    }
}

func main() {
    go runTask()
    time.Sleep(5 * time.Second)
    stopChan <- true
    time.Sleep(1 * time.Second) // Ensure main waits for task to stop
}

在这个例子中,runTask函数在一个goroutine中运行,并通过监听stopChan来接收停止信号。主函数中启动任务后,等待一段时间,然后通过stopChan发送停止信号。

回到顶部