Golang高并发代码分享


本文摘自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()

}

 

//这里模拟的http接口,每次请求抽象为一个job

func handle() {

 //wg.Add(1)

 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)}

}

 

// Start method starts the run loop for the worker, listening for a quit channel in

// case we need to stop it

func (w Worker) Start() {

 go func() {

  for {

   select {

   case <-JobQueue:

    // we have received a work request.

    doTask()

   case <-w.quit:

    // we have received a signal to stop

    return

   }

  }

 }()

}

 

// Stop signals the worker to stop listening for work requests.

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() {

 // starting n number of workers

 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》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...