Golang Go语言中开发web,如何控制任务启动/停止?

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

Golang Go语言中开发web,如何控制任务启动/停止?

实在是没有什么办法才来求助各位 V2 大佬,事情是这样的。。。 我要自己实现一个 web server,用来做数据同步。其中可以添加同步任务,也可以删除同步任务,可以手动开启同步任务,也可以停止。 以上是需求,现在小弟遇到了一个棘手问题。 在前端请求任务开始,这个很简单,我可以利用 go Startsync(id),这个 id 是小弟自己定义的任务 id,任务很可能有多个,如果停止任务呢?比如一个任务的 id 是 123,那么我现在要停止 123 这个任务,我该怎么做呢?冥思苦想好几天了,想过一些别的方法,比如在数据库中写入一个变量,停止任务时候修改这个变量,同步任务会不断请求这个参数,一旦发生变化,就 exit 任务。这是小弟想到的办法,请各位 V2 大佬给小弟一些灵感吧。拜谢,谨再拜。


更多关于Golang Go语言中开发web,如何控制任务启动/停止?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

13 回复

建立一个任务 ID 与 context 的对应 map 开任务时候创建一个 context 存入 map 中 停止任务通过任务 ID 去找 context 给 cancel 掉

https://golang.org/pkg/context/

更多关于Golang Go语言中开发web,如何控制任务启动/停止?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你只告诉楼主这个思路可能不太够,还要加上任务执行过程中要有「检测 context 的逻辑」。

楼主可以提供多一些信息:task 是什么性质?无限循环还是定时运行?一次执行时间多长?执行一半强行中断有没有副作用?

从大的思路上说,因为你没法拿到一个 goroutine 的 id 然后把这个 goroutine 杀掉,所以一定是在任务执行过程中有业务代码检测是否要停止执行,这个检测怎么实现就要看场景了,一楼提到的 context 很适合干这事。

是的 忘记告诉需要有一个检测过程了

用 context 就可以了,这个很容易 cancel 的。

用 context 这种依赖 runtime 的方式, 你要横向拓展多起几个 pod 的时候,不是很痛苦吗

除非这个服务一直玩单进程

context with cancel?

一切通讯都是信号,利用好信号,没有不能达到的

看下 frp,nps,goproxy 的代码,或者搜一下 go 语言+内网穿透

一楼的做法就行。每启动一个 task,分配 task id 和 context.without()并用一个 map 来存放映射关系,context 传入 task goroutine。启动个主循环检测取消 task chan,停止 api 收到停止,往取消 task chan 传入 task id 就行了。那边的主循环就收到 chan 的 task id,就去找到对应的 context,done()就 O 了。。。

context with cancel

在Go语言中开发Web应用时,控制任务的启动和停止通常涉及并发编程和任务管理。以下是一些常用的方法来实现这一目标:

  1. 使用Goroutine和Channel: Goroutine是Go中的轻量级线程,可以并发执行任务。你可以使用channel来同步goroutine之间的通信,从而控制任务的启动和停止。例如,可以创建一个启动信号channel和一个停止信号channel,通过向这些channel发送信号来控制任务的执行状态。

  2. 使用上下文(Context): Go的context包提供了一种在API边界之间传递截止日期、取消信号以及其他请求范围的值的方法。你可以创建一个context对象,并将其传递给goroutine。当需要停止任务时,可以通过取消context来通知goroutine停止执行。

  3. 使用任务管理库: 有些第三方库提供了更高级的任务管理功能,如任务调度、超时处理、重试机制等。这些库通常封装了goroutine和channel的使用,提供了更易于使用的API来控制任务的启动和停止。

  4. 服务注册与发现: 如果你的Web应用部署在微服务架构中,你可以使用服务注册与发现机制来控制任务的启动和停止。通过向服务注册中心注册或注销服务实例,你可以动态地管理任务的执行。

综上所述,控制Go语言中Web应用的任务启动和停止通常涉及并发编程和同步机制。你可以根据具体需求选择合适的方法来实现任务管理。

回到顶部