本文摘自php中文网,作者巴扎黑,侵删。
今天领导问起为什么用Golang,同事回答语法简单,语言新,支持高并发。那高并发到底如何实现,下面这篇文章主要给大家介绍了关于如何利用Golang写出高并发代码的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。前言
之前一直对Golang如何处理高并发http请求的一头雾水,这几天也查了很多相关博客,似懂非懂,不知道具体代码怎么写
下午偶然在开发者头条APP上看到一篇国外技术人员的一篇文章用Golang处理每分钟百万级请求,看完文章中的代码,自己写了一遍代码,下面自己写下自己的体会
核心要点
将请求放入队列,通过一定数量(例如CPU核心数)goroutine组成一个worker池(pool),workder池中的worker读取队列执行任务
实例代码
以下代码笔者根据自己的理解进行了简化,主要是表达出个人的思路,实际后端开发中,根据实际场景修改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | func doTask() {
time.Sleep(200 * time.Millisecond)
wg.Done()
}
func handle() {
job := Job{}
JobQueue <- job
}
var (
MaxWorker = 1000
MaxQueue = 200000
wg sync.WaitGroup
)
type Worker struct {
quit chan bool
}
func NewWorker() Worker {
return Worker{
quit: make(chan bool)}
}
func (w Worker) Start() {
go func() {
for {
select {
case <-JobQueue:
doTask()
case <-w.quit:
return
}
}
}()
}
func (w Worker) Stop() {
go func() {
w.quit <- true
}()
}
type Job struct {
}
var JobQueue chan Job = make(chan Job, MaxQueue)
type Dispatcher struct {
}
func NewDispatcher() *Dispatcher {
return &Dispatcher{}
}
func (d *Dispatcher) Run() {
for i := 0; i < MaxWorker; i++ {
worker := NewWorker()
worker.Start()
}
}
|
测试
1 2 3 4 5 6 7 8 9 10 | func Benchmark_handle(b *testing.B) {
runtime.GOMAXPROCS(runtime.NumCPU())
d := NewDispatcher()
d.Run()
for i:=0;i<10000;i++ {
wg.Add(1)
handle()
}
wg.Wait()
}
|
测试结果
1 2 3 | pkg: golang-study-demo/goroutine
1 2029931652 ns/op
PASS
|
1w个任务放到队列中,1000个worker去执行任务,每个任务的耗时200ms,任务执行完需要2s多
以上只是笔者的个人看法,不知道对Golang并发编程的理解是否正确,有错误的地方,希望高手指点一二,在此谢过
以上就是Golang高并发代码分享的详细内容,更多文章请关注木庄网络博客!!
相关阅读 >>
Python中关于eval函数与ast.literal_eval使用的区别介绍(图文)
怎么安装Python的pygame库文件
Python阶乘函数怎么使用
Python中单行注释以什么开头
如何结束退出Python脚本
什么是Python类属性?如何用Python访问属性?
Python 快速使用 rest api
Python中顺序表算法复杂度的相关知识介绍
洞悉 Python基础概况
Python中range() 函数的使用介绍(附代码)
更多相关阅读请进入《Python》频道 >>
人民邮电出版社
python入门书籍,非常畅销,超高好评,python官方公认好书。
转载请注明出处:木庄网络博客 » Golang高并发代码分享