在我的第一次迭代中,我得到了以下代码来编译和工作:
package main
import (
"fmt"
"sync"
)
var wg sync.WaitGroup
func routineHandle (query string, ch chan <- string) {
ch <- query
wg.Wait()
}
func ping () {
ch := make(chan string)
wg.Add(1)
go routineHandle("testquery",ch)
wg.Done()
msg := <-ch
fmt.Println("Channel Message",msg)
}
func main () {
ping()
}
这成功地使用了一个通道来执行goroutine routineHandle
现在,我想添加执行以下任务的web服务器功能:
我的代码在没有gui的linux机器上,所以我不知道如何测试web服务器的能力。
我的代码如下所示:
package main
import (
"fmt"
"sync"
"net/http"
)
var wg sync.WaitGroup
func routineHandle (query string, ch chan <- string) {
ch <- query
wg.Wait()
}
func ping (w http.ResponseWriter, r *http.Request) {
ch := make(chan string)
wg.Add(1)
go routineHandle("testquery",ch)
wg.Done()
msg := <-ch
//fmt.Println("Channel Message",msg)
w.Write([]byte msg)
}
func main() {
http.HandleFunc("/",ping)
http.ListenAndServe(":1234",nil)
}
您将注意到我的第二段代码中添加了一些内容:
net/http
包main method
http listener
向ping函数添加了响应编写器和请求参数fmt.Println()
更改为ping最终目标是输入一个查询,然后在routineHandle
goroutine中使用该查询
如我所说,我不知道如何在ubuntu box without a gui
上测试这个最终的实现
最后要注意的一件事。如果你注意到任何问题,请让我知道。我想知道在http服务器中运行goroutine是否会导致问题。
发布于 2018-06-08 04:11:21
问题中的代码不正确地使用等待组(等待和完成应该交换,组不应该全局共享),并且与通道冗余。删除使用等待组修复的代码。
package main
import (
"net/http"
)
func routineHandle(query string, ch chan<- string) {
ch <- query
}
func ping(w http.ResponseWriter, r *http.Request) {
ch := make(chan string)
go routineHandle("testquery", ch)
msg := <-ch
w.Write([]byte(msg))
}
func main() {
http.HandleFunc("/", ping)
http.ListenAndServe(":1234", nil)
}
https://stackoverflow.com/questions/50746818
复制相似问题