Golang Goroutine 与 channel 同步

我有以下程序,其中使用 gorilla mux 创建 HTTP 服务器。当任何请求到来时,它启动 goroutine 1。在处理中,我正在启动另一个 goroutine 2。我想在 goroutine 1 中等待 goroutine 2 的响应?我怎么能这样做?如何确保只有 goroutine 2 会响应 goroutine 1?

GR3 可以创建 GR4,GR 3 应该只等待 GR4。

GR = Goroutine

http://img.mukewang.com/628b33a70001265903240493.jpg

服务器


    package main


import (

    "encoding/json"

    "fmt"

    "net/http"

    "strconv"

    "time"


    "github.com/gorilla/mux"

)


type Post struct {

    ID    string `json:"id"`

    Title string `json:"title"`

    Body  string `json:"body"`

}


var posts []Post


var i = 0


func getPosts(w http.ResponseWriter, r *http.Request) {

    w.Header().Set("Content-Type", "application/json")

    i++

    fmt.Println(i)

    ch := make(chan int)

    go getTitle(ch, i)


    p := Post{

        ID: "123",

    }

    // Wait for getTitle result and update variable P with title


    s := <-ch

    //


    p.Title = strconv.Itoa(s) + strconv.Itoa(i)

    json.NewEncoder(w).Encode(p)

}


func main() {


    router := mux.NewRouter()

    posts = append(posts, Post{ID: "1", Title: "My first post", Body: "This is the content of my first post"})

    router.HandleFunc("/posts", getPosts).Methods("GET")

    http.ListenAndServe(":9999", router)

}


func getTitle(resultCh chan int, m int) {

    time.Sleep(2 * time.Second)

    resultCh <- m

}



慕虎7371278
浏览 123回答 2
2回答

德玛西亚99

有几种方法可以做到这一点,一个简单的方法是使用渠道将 getTitle 函数更改为此func getTitle(resultCh chan string)&nbsp; {&nbsp; &nbsp;time.Sleep(2 * time.Second)&nbsp; &nbsp;resultCh <- "Game Of Thrones"}getPosts 会像这样使用它func getPosts(w http.ResponseWriter, r *http.Request) {&nbsp; &nbsp;w.Header().Set("Content-Type", "application/json")&nbsp; &nbsp;ch := make(chan string)&nbsp; &nbsp;go getTitle(ch)&nbsp; &nbsp;s := <-ch // this will wait until getTile inserts data to channel&nbsp;&nbsp; &nbsp;p := Post{&nbsp; &nbsp; &nbsp; &nbsp;ID: s,&nbsp; &nbsp;}&nbsp; &nbsp;json.NewEncoder(w).Encode(p)}我怀疑你是新来的,这是一个基本的频道用法,在这里查看更多详细信息频道

繁星淼淼

所以你遇到的问题是你还没有真正了解如何处理并发代码(不是dis,我曾经在那里)。其中大部分都不是围绕渠道进行的。正如@kojan 的回答所解释的那样,这些频道工作正常。出问题的地方在于i变量。首先,您必须了解这i不是原子突变,因此如果您的客户端请求并行到达,您可能会弄乱数字:C1 :&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; C2:i == 6&nbsp; &nbsp; &nbsp; &nbsp; i == 6i++&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;i++i == 7&nbsp; &nbsp; &nbsp; &nbsp; i == 7软件中的两个增量实际上变成了一个增量,因为实际上i++是 3 个操作:加载、增量、存储。你遇到的第二个问题是它i不是一个指针,所以当你传递i给你的 go 例程时,你正在制作一个副本。go 例程中的i被发送回通道,并成为连接字符串中的第一个数字,您可以观看增量。然而i,在字符串尾部使用的剩余部分继续通过连续的客户端调用增加。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go