代码之家  ›  专栏  ›  技术社区  ›  mrjd

Goroutine不运行

  •  2
  • mrjd  · 技术社区  · 7 年前

    我正在尝试使用goroutine将项目写入数据库。然而,出于某种原因,goroutine似乎没有做任何事情。

    我有以下功能:

    func addEvent(w http.ResponseWriter, r *http.Request) {
        body, err := ioutil.ReadAll(r.Body)
        fmt.Println(string(body[:]))
    
        if err != nil {
            panic(err)
        }
    
        eventCh := make(chan []byte)
        eventCh <- body
        go models.WriteEventToDb(eventCh)
    
    }
    

    func WriteEventToDb(eventCh chan []byte) {
        fmt.Println("event")
        event := <-eventCh
        newEvent := createNewEvent(event)
        err := db.Insert(&newEvent)
    
        if err != nil {
            panic(err)
        }
    
    }
    

    知道为什么WriteEventToDb不运行吗?

    1 回复  |  直到 7 年前
        1
  •  6
  •   Adrian    7 年前

    在开始goroutine之前,您的函数会阻塞:

    eventCh := make(chan []byte)
    eventCh <- body
    

    这会创建一个新通道,在它可以传递到任何其他例程之前,它会尝试向该通道发送消息。由于通道是无缓冲的,并且没有从中读取任何内容,因此发送会无限期地阻塞。