第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

http handlefunc 上的 Golang 地圖更新

http handlefunc 上的 Golang 地圖更新

Go
LEATH 2022-11-23 20:38:18
我有一個(gè)關(guān)于 map 語(yǔ)言的問(wèn)題。我想處理客戶端 ( ) 并使用(key (client IP) value pair) http保存他們的一些信息...使用新線程處理每個(gè) http 客戶端,所以我認(rèn)為更改(添加、刪除、編輯)數(shù)據(jù)將不安全……我的行為安全嗎?maphttpmappackage mainimport (    "net/http")func main() {    var clientsData map[string]string    http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) {        // Is this map adding, safe or i have to use thread lock (mutex or ...) ?        clientsData[request.RemoteAddr] = ...    })    http.ListenAndServe("127.0.0.10:8090", nil)}
查看完整描述

2 回答

?
子衿沉夜

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊

簡(jiǎn)單地使用https://eli.thegreenplace.net/2019/on-concurrency-in-go-http-servers/中的示例可以構(gòu)建一個(gè)簡(jiǎn)單的示例,表明它并不安全。


使用一個(gè)簡(jiǎn)單的程序,如:


package main


import (

    "net/http"

)


func main() {

    counters := map[string]int{}

    name := "test"

    counters[name] = 0

    http.HandleFunc("/test", func(w http.ResponseWriter, req *http.Request) {

        counters[name]++

    })


    http.ListenAndServe(":8000", nil)

}

并刺激使用:


ab -n 20000 -c 200 "127.0.0.1:8000/test"

產(chǎn)生異常,如:


goroutine 158 [running]:

runtime.throw({0x64d95a, 0x81faa0})

        /usr/local/go/src/runtime/panic.go:1198 +0x71 fp=0xc000384980 sp=0xc000384950 pc=0x4348f1

runtime.mapaccess2_faststr(0x697360, 0xc0003a4ba0, {0x644851, 0x4})

        /usr/local/go/src/runtime/map_faststr.go:116 +0x3d4 fp=0xc0003849e8 sp=0xc000384980 pc=0x413d34

main.main.func1({0x69bf00, 0xc0003a4b60}, 0x0)

        /home/test/gohttp/main.go:13 +0x46 fp=0xc000384a48 sp=0xc0003849e8 pc=0x5eba86

net/http.HandlerFunc.ServeHTTP(0x0, {0x69bf00, 0xc0003a4b60}, 0x0)


查看完整回答
反對(duì) 回復(fù) 2022-11-23
?
www說(shuō)

TA貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超8個(gè)贊

如果您只閱讀,那是安全的。

如果你需要寫,你需要一些方法來(lái)做到“線程安全”

第一個(gè)想法是使用 sync.Mutex 來(lái)保護(hù)對(duì)地圖的訪問(wèn)

然而,這可能成為瓶頸,因?yàn)槟赡苡卸鄠€(gè)并行請(qǐng)求,但每次只能寫入一個(gè)。我們談?wù)摰氖羌{秒……

第二種方法可以使用讀/寫互斥鎖來(lái)控制讀寫。許多 goroutines 可以讀取,但每次只有一個(gè)可以寫入。

包同步和同步/原子還有其他選項(xiàng)。

還有一種額外的方法需要考慮:如果你只需要寫入這個(gè)地圖,你可以考慮使用緩沖通道發(fā)送一個(gè)鍵/值結(jié)構(gòu),以便在單個(gè) goroutine 中使用(負(fù)責(zé)將它存儲(chǔ)到地圖中)

如您所見(jiàn),如果對(duì)您的應(yīng)用程序有意義,這種方法有很多優(yōu)點(diǎn)。

您甚至可以使用通道通過(guò)回調(diào)來(lái)安全讀/寫,但這是另一回事了。

如果您有疑問(wèn),請(qǐng)編寫單元測(cè)試并使用競(jìng)爭(zhēng)條件檢測(cè)器


查看完整回答
反對(duì) 回復(fù) 2022-11-23
  • 2 回答
  • 0 關(guān)注
  • 131 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)