关于用cron写定时任务时,函数和任务名是动态变量越界的问题

weixin_38052215 2019-09-20 10:57:51
最近用goalng的"github.com/jakecoffman/cron"包来写一个任务管理功能
创建多个定时器的代码如下:

for i = 0; i < len(spec); i++ {
c.AddFunc(spec[i][1], func() {
fmt.Println("协程开始采集ID为:")
go spider(spec[i][0])
}, spec[i][0])
}

提示是 i 变量越界。后来发现golang编译的时候,可能把c.Addfunc中的内容放在最后去编译,导致,i变量都是最后最大的哪个数值,没有达到循环创建不同定时器的目的,困扰了二天了,还是没有办法解决。求高手指点。
...全文
74 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38055995 2019-09-20
  • 打赏
  • 举报
回复
你是在讨论闭包问题吧…… 你for循环内加个var currentspec=spec[i][1],然后调用currentspec看看。 其实这都不是最好的方式……
weixin_38058131 2019-09-20
  • 打赏
  • 举报
回复
谢谢,这样确实解决了。不过我还想问问,就是你说还有更好的方式,是什么的
weixin_38058748 2019-09-20
  • 打赏
  • 举报
回复
给你spec[i] 这个type加方法。 for i=0;i <len (spec);i++{ spec[i].Start() }
weixin_38066087 2019-09-20
  • 打赏
  • 举报
回复
func (s Spec) Start(){ c.AddFunc(s, func(){ fmt.Println("协程开始采集ID为:") go spider(s[0]) }, s) }
weixin_38095546 2019-09-20
  • 打赏
  • 举报
回复
cron有一个开始执行AddFunc()的方法c.Start()
weixin_38098895 2019-09-20
  • 打赏
  • 举报
回复
cron中AddFunc()方法相当于并发执行,主进程中i肯定到临界点了,所以再用spec[i]这种形式肯定显示超出切片范围。 而且你AddFunc()方法参数还写错了,不能有第3个参数。 解决方法就是给AddFunc()方法传入确定的值。x1 := spec[i][0];x2 := spec[i][1]
weixin_38109453 2019-09-20
  • 打赏
  • 举报
回复
你可以ctrl+鼠标左键,查看一下AddFunc()方法的代码
weixin_38110434 2019-09-20
  • 打赏
  • 举报
回复
你没注意到我用的包,可以有第三个参数,就是定义任务的名称,这样就可以删除任务。c.Start() 我是写在for 循环前面了,我的理解是开始定义并执行任务。jarlyyn大神 说的 spec[i].Start() for中加这句,我去试一下。
weixin_38112462 2019-09-20
  • 打赏
  • 举报
回复
嗯,那问题就是go的闭包与并发问题了,你可以看下这个博客,解释的很详细https://www.bangbangde.com/post/golang_goroutines_and_closures.html
weixin_38116935 2019-09-20
  • 打赏
  • 举报
回复
就是重新定义变量,和传参函数调用两种方式
weixin_38132030 2019-09-20
  • 打赏
  • 举报
回复
好的,谢谢

433

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧