我有一个非常基本的Golang应用程序,它可以创建并运行HTTP服务器。服务器有2个端点,一个发送数据和一个接收。同时从地图上书写和读取会导致潜在的竞争条件
在每次POST请求发送到服务器,解析从主体输入的数据并将其推入的信道。然后我有一个函数可以读取通道并将数据保存到地图中。
在每个GET请求到服务器,JSON编组地图并将其发送到客户端。
每个请求的HTTP服务器异步运行,工人功能在其自身的goroutine同步写入地图。
基本伪代码如下:
package main
import (
"net/http"
)
type dataStore map[string]string
func listenHandler(stream chan string) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
// JSON unmarshal request body
// push data onto stream
stream <- data
}
}
func serveHandler(store *dataStore) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
// JSON marshal data store
// serve to client
}
}
func worker(stream <-chan string) *dataStore {
store := make(dataStore)
go func() {
for data := range stream {
// process and write data to map
}
}()
return &store
}
func main() {
stream := make(chan string)
store := worker(stream)
http.HandleFunc("/listen", listenHandler(stream))
http.HandleFunc("/serve", serveHandler(store))
http.ListenAndServe(":8080", nil)
}
我已经测试和运行,没有任何问题的应用程序,但有人告诉我它有一个潜在的竞争条件,我不知道为什么。这是真的?
您是否使用'-race'选项构建并运行了代码? –
@GrzegorzŻur是建立一个测试,它运行良好。 – danbondd
你的地图没有同步,可以同时修改和读取。 – JimB