gpt4 book ai didi

go - 如何让我的函数立即返回到 Slack?

转载 作者:IT王子 更新时间:2023-10-29 01:56:28 25 4
gpt4 key购买 nike

我正在尝试为 Slack 开发一个简单的 API,我想立即向用户返回一些东西以避免 3000 毫秒超时。

这是我的问题:

  1. 为什么 This should be printed to Slack first 没有立即打印出来,而是我只收到最后一条消息,即 The long and blocking process completed?但是它出现在 ngrok 日志中。

  2. 为什么我的函数仍然达到 3000 毫秒限制,即使我已经在使用 go 例程?是因为 done channel 吗?

func testFunc(w http.ResponseWriter, r *http.Request) {
// Return to the user ASAP to avoid 3000ms timeout.
// But this doesn't work. Nothing is returned but
// the message appeared in ngrok log.
fmt.Fprintln(w, "This should be printed to Slack first!")

// Get the response URL.
r.ParseForm()
responseURL := r.FormValue("response_url")

done := make(chan bool)

go func() {
fmt.Println("Warning! This is a long and blocking process.")
time.Sleep(5 * time.Second)

done <- true
}()

// This works! I received this message. But I still reached the 3000ms timeout.
func(d bool) {
if d == true {
payload := map[string]string{"text": "The long and blocking process completed!"}
j, err := json.Marshal(payload)

if err != nil {
w.WriteHeader(http.StatusInternalServerError)
}

http.Post(responseURL, "application/json", bytes.NewBuffer(j))
}
}(<-done)
}

最佳答案

http.ResponseWriter 默认情况下缓冲流。如果您希望将数据实时发送到客户端(例如 HTTP SSE),您需要在每个“事件”之后刷新流:

wf, ok := w.(http.Flusher)

if !ok {
http.Error(w, "Streaming unsupported!", http.StatusInternalServerError)
return
}

fmt.Fprintln(w, "This should be printed to Slack first!")

wf.Flush()

刷新是昂贵的——所以利用 go 的缓冲。一旦你的处理程序最终退出,总会有一个隐式刷新(因此你看到你的输出“​​迟到”)。

关于go - 如何让我的函数立即返回到 Slack?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54791455/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com