前言
- 過了很長(zhǎng)一段時(shí)間显蝌,最近終于有空續(xù)編golang分層測(cè)試藏杖,前面的一些文章已經(jīng)講述過關(guān)于golang的單元測(cè)試和http的接口測(cè)試笋庄,從本文就開始講關(guān)于如何使用golang進(jìn)行http接口壓測(cè)另凌,從自己編碼到使用一些壓測(cè)工具來講述
多線程并發(fā)-Goroutines
- Goroutines 可以理解為golang的微小輕量級(jí)線程康吵,創(chuàng)建一個(gè) goroutine 实夹,只需要把 go 關(guān)鍵字放在函數(shù)調(diào)用語句前橄浓,就像創(chuàng)建了一個(gè)線程一樣,但是它比線程更小亮航,十幾個(gè)goroutine可能體現(xiàn)在底層就是五六個(gè)線程荸实。執(zhí)行g(shù)oroutine只需極少的棧內(nèi)存(大概是4~5KB),當(dāng)然會(huì)根據(jù)相應(yīng)的數(shù)據(jù)伸縮缴淋。也正因?yàn)槿绱死崂眨赏瑫r(shí)運(yùn)行成千上萬個(gè)并發(fā)任務(wù)。goroutine比thread更易用宴猾、更高效圆存、更輕便
代碼如下:
package main
import (
"fmt"
"time"
)
//并發(fā)執(zhí)行的方法
func compute(value int) {
for i := 0; i < value; i++ {
time.Sleep(time.Second)
fmt.Println(i)
}
}
func main() {
fmt.Println("Goroutine Println")
//啟動(dòng)兩個(gè)goroutines
go compute(10)
go compute(10)
time.Sleep(time.Second * 1)
}
- 這樣可以嘗試查看一下輸出,就可以看到并行的效果仇哆,同時(shí)主線程為了等待goroutine都運(yùn)行完畢沦辙,不得不在程序的末尾使用time.Sleep() 來睡眠一段時(shí)間,等待其他線程充分運(yùn)行讹剔。對(duì)于簡(jiǎn)單的代碼油讯,100個(gè)for循環(huán)可以在1秒之內(nèi)運(yùn)行完畢,time.Sleep() 也可以達(dá)到想要的效果
使用Goroutines編寫壓測(cè)腳本
- 大概了解了Goroutines之后我們就可以嘗試一下編寫http的并發(fā)腳本
package main
import (
"fmt"
"net/http"
"strings"
"time"
)
var(
no =0
ok =0 //記錄請(qǐng)求成功失敗數(shù)
useTime = 0.0 //使用時(shí)間
num=100 //并發(fā)個(gè)數(shù)
)
func main() {
startTime := time.Now().UnixNano()//記錄并發(fā)開始時(shí)間
goroutinetest(num)
endTime := time.Now().UnixNano()
useTime = float64(endTime-startTime) / 1e9 //記錄所有請(qǐng)求完成時(shí)間
fmt.Println("響應(yīng)成功數(shù):",ok)
fmt.Println("相應(yīng)失敗數(shù):",no)
fmt.Println("qps :", fmt.Sprintf("%.4f", float64(num)/useTime))
}
func goroutinetest(num int) {
for i := 0; i < num; i++ {
go postdata()
}
time.Sleep(time.Second * 1)
}
func postdata(){
resp, err := http.Post("http://www.baidu.com", "application/x-www-form-urlencoded", strings.NewReader("id=1"))
if err != nil {
panic(err)
}
//關(guān)閉連接
defer resp.Body.Close()
if resp.StatusCode != 200 {no += 1}//使用響應(yīng)嗎作為斷言
else{ok += 1}
}
go run godemotest3.go
響應(yīng)成功數(shù): 100
相應(yīng)失敗數(shù): 0
qps : 99.9300
- 簡(jiǎn)單地通過使用goroutines就能起到并發(fā)發(fā)起請(qǐng)求延欠,從而起到壓測(cè)的效果陌兑,goroutines作為golang并發(fā)編程的一個(gè)很核心的組件,除了我們可以使用來做壓測(cè)由捎,還有需要場(chǎng)景可以應(yīng)用到兔综,大家可以后期繼續(xù)探究
小結(jié)
- 壓測(cè)的核心就是懂得怎么使用并發(fā)和做好阻塞,golang中g(shù)oroutines是并發(fā)的扛把子狞玛,接下來的一篇文章將會(huì)講述怎么場(chǎng)景化的通過golang寫壓測(cè)腳本软驰,敬請(qǐng)期待