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

2020-02-29 01:44:37 +08:00
 PEIENYKYK

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

3364 次点击
所在节点    Go 编程语言
12 条回复
Srar
2020-02-29 02:17:44 +08:00
建立一个任务 ID 与 context 的对应 map 开任务时候创建一个 context 存入 map 中 停止任务通过任务 ID 去找 context 给 cancel 掉

https://golang.org/pkg/context/
mornlight
2020-02-29 03:01:38 +08:00
@Srar 你只告诉楼主这个思路可能不太够,还要加上任务执行过程中要有「检测 context 的逻辑」。

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

从大的思路上说,因为你没法拿到一个 goroutine 的 id 然后把这个 goroutine 杀掉,所以一定是在任务执行过程中有业务代码检测是否要停止执行,这个检测怎么实现就要看场景了,一楼提到的 context 很适合干这事。
Srar
2020-02-29 04:11:29 +08:00
@mornlight 是的 忘记告诉需要有一个检测过程了
1wlinesperday
2020-02-29 09:32:22 +08:00
用 context 就可以了,这个很容易 cancel 的。
alexsunxl
2020-02-29 09:54:24 +08:00
用 context 这种依赖 runtime 的方式, 你要横向拓展多起几个 pod 的时候,不是很痛苦吗

除非这个服务一直玩单进程
JackyCDK
2020-02-29 12:28:39 +08:00
context with cancel?
encro
2020-02-29 17:46:57 +08:00
一切通讯都是信号,利用好信号,没有不能达到的
encro
2020-02-29 17:49:34 +08:00
看下 frp,nps,goproxy 的代码,或者搜一下 go 语言+内网穿透
fizzday
2020-02-29 19:26:43 +08:00
useben
2020-02-29 20:24:37 +08:00
一楼的做法就行。每启动一个 task,分配 task id 和 context.without()并用一个 map 来存放映射关系,context 传入 task goroutine。启动个主循环检测取消 task chan,停止 api 收到停止,往取消 task chan 传入 task id 就行了。那边的主循环就收到 chan 的 task id,就去找到对应的 context,done()就 O 了。。。
useben
2020-02-29 20:24:54 +08:00
context with cancel
labulaka521
2020-03-01 00:42:39 +08:00
https://www.v2ex.com/t/648602 基本满足你你要求

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/648489

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX