1.需求说明
我用django rest framework写了一个简单的用户增删改查小案例,然后我想使用golang实现一个多并发请求,看看我的小项目能承受多少请求!初学go代码不正确,请多多指点。
2.代码实现
在go语言中其实有两种方法进行协程之间的通信。,一个是共享内存一个是消息传递,我们首先使用共享内存的方法去实现我们的需求。
//基本的GET请求
package main
import (
"fmt"
"io/ioutil"
"net/http"
"time"
"sync"
"runtime"
)
// 计数器
var counter int = 0
func httpget(lock *sync.Mutex){
lock.Lock()
counter++
resp, err := http.Get("http://localhost:8000/rest/api/user")
if err != nil {
fmt.Println(err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
fmt.Println(resp.StatusCode)
if resp.StatusCode == 200 {
fmt.Println("ok")
}
lock.Unlock()
}
func main() {
start := time.Now()
lock := &sync.Mutex{}
for i := 0; i < 800; i++ {
go httpget(lock)
}
for {
lock.Lock()
c := counter
lock.Unlock()
runtime.Gosched()
if c >= 800 {
break
}
}
end := time.Now()
consume := end.Sub(start).Seconds()
fmt.Println("程序执行耗时(s):", consume)
}
3.问题
我们可以看到共享内存的方式是可以做到并发,但是我们需要利用共享变量来进行协程的通信,也就需要使用互斥锁来确保数据安全性,导致代码啰嗦,复杂话,不易维护。我们后续使用go的消息传递方式避免这些问题。