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

Goroutines 通信槽通道仅工作一次

Goroutines 通信槽通道仅工作一次

Go
富国沪深 2023-07-04 15:42:54
我第一次尝试使用 Go 例程和通道通信在 Golang (1.12) 中编写代码。我有 Telegram 机器人和一段代码,可以在发生某些更新并需要答案时与机器人进行通信。同时,我尝试放置一些 Web 服务,该服务将通过 http GET 获取消息并将其发送给 Bot。事实上它确实有效,但只有一次。之后Bot部分仍在工作,但无法执行http Get请求,它会一直挂起直到超时。我尝试使用带有缓冲区的通道,但在这种情况下它完全停止工作。//App is a structure with Bot objectstype App struct {    Router *mux.Router    Bot}//Initialize is method to initialize App sessionfunc (a *App) Initialize() {    var err error    a.Bot.BotAPI, err = telegram.NewBotAPI(TelegramBotAPIkey)    checkErr(err)    a.Router = mux.NewRouter()    a.initializeRoutes()    msgChanel = make(chan string)}func (a *App) initializeRoutes() {    a.Router.HandleFunc("/", a.homePage).Methods("GET")    a.Router.Path("/message/send").Queries("msg", "{msg}").HandlerFunc(a.getMessage).Methods("GET")}}// Handling of requests to send/messagefunc (a *App) getMessage(w http.ResponseWriter, r *http.Request) {    fmt.Fprintln(w, "-----Send message to Bot-------")    vars := mux.Vars(r)    if vars["msg"] != "" {        fmt.Fprintln(w, vars["msg"])        msgChanel <- vars["msg"]    }// Run is all about running applicationfunc (a *App) Run() {    var wg sync.WaitGroup    wg.Add(2)    go func() {        defer wg.Done()        msg := <-msgChanel        a.Bot.generateAnswer(msgid, msg)    }()    go func() {        var msg string        defer wg.Done()        a.Bot.BotAPI.Debug = true        u := telegram.NewUpdate(0)        u.Timeout = 60        updates, err := a.Bot.BotAPI.GetUpdatesChan(u)        checkErr(err)        for update := range updates {            if update.Message == nil {                continue            }            msg = ""            msgid = update.Message.Chat.ID            a.Bot.generateAnswer(msgid, msg)        }    }()    log.Fatal(http.ListenAndServe(":8080", a.Router))    wg.Wait()}我的问题是没有错误消息。我运行应用程序,然后它在 Bot 通信方面工作,但与 Web 服务的通信仅发生一次。我的第一个想法是,这是因为通道阻塞,但是我将字符串发送到通道,然后我读取它,所以它不应该有任何阻塞。所以我的期望是,每次当我发送带有消息文本的 http GET 时,它将立即发送到 Bot,并且系统已准备好接收下一个请求。
查看完整描述

1 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

似乎“msgChanel”只用“msg := <-msgChanel”读取一次。通道被阻塞并且无法由 HTTP 请求处理程序写入。也许您应该使用 for 循环读取通道值。



查看完整回答
反对 回复 2023-07-04
  • 1 回答
  • 0 关注
  • 106 浏览
慕课专栏
更多

添加回答

举报

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