1

我一直在尝试使用渠道来构建某种生产者/消费者。我有一个requests渠道,许多生产者推送请求,然后我有processRequests处理请求的渠道。

package main

var requests chan string

func processRequests() {
    for {
        request <- requests
        // Process request...
        // And return response - how?
    }
}

func main() {
    requests = make(chan string)

    go processRequests()

    requests <- "doSomething"
    requests <- "doSomethingElse"
    requests <- "etc"

    select {} // Block forever
}

我想知道的是,一旦请求得到满足,将响应发送回生产者(以及正确的,因为不止一个)的最佳方式是什么?基本上如何使它成为一个双向通道?

知道怎么做吗?

4

1 回答 1

1

你真的应该使用两个渠道。试图让它与一个频道一起工作会很混乱。

生产者/消费者模式上有一个谷歌站点可能有用。

为了让生产者知道消费者正在响应什么,您可以使用一个结构来响应:

type responseMessage struct {
    Request string
    Response string
}

var requests chan string
var responses chan *responseMessage

func processRequests() {
    for {
        request <- requests
        // Process request...
        responses <- &responseMessage{request, "some response string"}
    }
}

func processResponses() {
    someResponseMessage := <- responses
    if someResponseMessage.Request == "doSomething" {
        // do something!
    }
}

func main() {
    requests = make(chan string)
    responses = make(chan *responseMessage)

    go processRequests()
    go processResponses()

    requests <- "doSomething"
    requests <- "doSomethingElse"
    requests <- "etc"

    select {} // Block forever
}
于 2014-01-21T19:06:40.170 回答