2 回答
TA贡献1900条经验 获得超5个赞
如果我理解一切正确,您应该在分离的 goroutine 内开始解析循环,以便更新循环继续工作。
尝试做这样的事情:
// you can use cancel to stop running parsing goroutine
ctx, cancel := context.WithCancel(context.Background())
go func() {
ticker := time.NewTicker(5 * time.Second)
defer ticker.Stop()
for {
select {
case <-ctx.Done():
return
case <-ticker.C:
AreThereChanges?()
if yes {
msg := tgbotapi.NewMessage(update.Message.Chat.ID, "help please")
bot.Send(msg)
}
}
}
}()
从我的脑海中写作,所以不要指望它从第一次尝试就编译,而是演示这个想法。请查看以下链接以获取有关 Ticker 和取消上下文的更多信息:单击、单击。
TA贡献1998条经验 获得超6个赞
我对 goroutine 和通道进行了一些研究。无限循环在一个单独的 goroutine 中,转义是通过无缓冲通道完成的(检查示例代码中的“游戏改变者”注释)。现在我可以在需要时进入和退出无限循环。这是我解决问题的方法:
u := tgbotapi.NewUpdate(0)
u.Timeout = 60
updates, err := bot.GetUpdatesChan(u)
done := make(chan bool) //game changer
for update := range updates {
if update.Message != nil {
switch update.Message.Text {
case "Show Keyboard":
Keyboard is sent
case "OptionsForParsing":
options.applied
case "StartParsing":
search bool = true
case "StopParsing":
search bool = false
done<-true //game changer
}
go func() {
ticker := time.NewTicker(time.Minute)
defer ticker.Stop()
if search{
for {
select {
case <-done: //game changer
return
case <-ticker.C:
AnyChanges?()
}
}}
}()
}
}
- 2 回答
- 0 关注
- 151 浏览
添加回答
举报