为了账号安全,请及时绑定邮箱和手机立即绑定

如何运行无限循环并在电报机器人中不断获取更新

如何运行无限循环并在电报机器人中不断获取更新

Go
白猪掌柜的 2022-06-06 16:03:46
我正在使用 Go ( go-telegram-bot-api ) 编写电报机器人。它不断解析网站并通知更改(每分钟)。今天我添加了简单的键盘,现在不能让它们一起工作。问题是网页解析处于无限循环中,当它进入循环时,程序会忽略来自“客户端”的更新。我已经尝试将所有内容放在一个循环中,更改订单等。也许有另一种或正确的方法可以做到这一点?示例代码:    u := tgbotapi.NewUpdate(0)    u.Timeout = 60    updates, err := bot.GetUpdatesChan(u)    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                   }            }            if search == true{              for{                 time.Sleep(1 * time.Minute)                 AreThereChanges?()                 if yes{                         msg := tgbotapi.NewMessage(update.Message.Chat.ID, "help please")                         bot.Send(msg)                 }            }}     }
查看完整描述

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 和取消上下文的更多信息:单击、单击。


查看完整回答
反对 回复 2022-06-06
?
米琪卡哇伊

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?()

                    }

                }}              

            }()

        }

 }


查看完整回答
反对 回复 2022-06-06
  • 2 回答
  • 0 关注
  • 151 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信