V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
Hanggi
V2EX  ›  Go 编程语言

Go gin 框架如何开启和停止任务

  •  
  •   Hanggi · 2019-08-07 16:37:36 +08:00 · 5561 次点击
    这是一个创建于 1964 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

    要如何实现呢?

    第 1 条附言  ·  2019-08-07 21:31:33 +08:00
    不是说跟 gin 有什么关系,而是要在 gin 实现它。
    目前有一种实现方案,但是感觉并不是特别优雅,想寻求一种优雅的实现方法。

    简单说就是多任务并发队列,每个任务都有不同的循环周期。
    需要添加新任务,查询所有任务,停止并删除指定任务。

    求优雅的实现方法。
    16 条回复    2019-08-08 02:30:34 +08:00
    liangjx
        1
    liangjx  
       2019-08-07 16:42:31 +08:00
    设置一个信号量,stop 修改信号量
    ManjusakaL
        2
    ManjusakaL  
       2019-08-07 17:41:21 +08:00
    最好依靠专门的队列来做吧。。
    thet
        3
    thet  
       2019-08-07 17:49:14 +08:00 via Android
    跟 gin 无关,要看接口里面的 handler 怎么实现,任务跑在哪的
    labulaka521
        4
    labulaka521  
       2019-08-07 18:16:10 +08:00 via Android
    暂停任务可以使用 context
    karllynn
        5
    karllynn  
       2019-08-07 19:58:42 +08:00
    这跟 gin 有啥关系…
    Hanggi
        6
    Hanggi  
    OP
       2019-08-07 20:00:24 +08:00
    @karllynn Api 框架啊
    reus
        7
    reus  
       2019-08-07 20:08:47 +08:00   ❤️ 2
    这和 gin 没有关系,你不用 gin 不会实现的话,用 gin 你也一样不会实现
    yiyi11
        8
    yiyi11  
       2019-08-07 20:32:06 +08:00 via Android
    你需要一个监听器。
    Hanggi
        9
    Hanggi  
    OP
       2019-08-07 21:12:30 +08:00
    @reus 嗯,不用 gin 知道怎么做,但是得加到 gin 上去,会吗?
    a7a2a7a2
        10
    a7a2a7a2  
       2019-08-07 21:27:59 +08:00
    4 楼说对了,早两年就有出了外部控制协程的官方库了,context
    Hanggi
        11
    Hanggi  
    OP
       2019-08-07 21:41:28 +08:00
    @labulaka521
    @a7a2a7a2 谢谢,研究下。
    labulaka521
        12
    labulaka521  
       2019-08-07 22:23:11 +08:00
    @Hanggi 可以这样做 任务运行的时候穿进去 ctx 然后保存这个 ctx 对应的 cancelFunc 和任务名称保存在一个 map 中 map 是全局变量,然后停止的时候从 map 中取出任务对应的 cancelFunc 执行就可以了
    Hanggi
        13
    Hanggi  
    OP
       2019-08-07 22:48:38 +08:00
    @labulaka521 谢谢,要的就是这个。
    clearT
        14
    clearT  
       2019-08-07 23:22:34 +08:00 via iPhone
    https://github.com/robfig/cron
    github.com/jakecoffman/cron
    看看这两个能满足吗,后者再前者上封装了删除任务的方法
    Mark3K
        15
    Mark3K  
       2019-08-08 00:39:38 +08:00
    这 API 设计的很有趣,跟函数名有异曲同工之妙
    Mitt
        16
    Mitt  
       2019-08-08 02:30:34 +08:00 via iPhone
    这确实跟 gin 没关系,你的问题其实应该是如何持久化存储状态
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2872 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 12:53 · PVG 20:53 · LAX 04:53 · JFK 07:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.