基于并发编程提高单机处理性能

本文探讨了Golang在HTTP标准库中使用goroutine提高单机性能的策略,通过减少I/O阻塞时间和提升CPU效率,详细解析了代码实现,并提出采用goroutine池控制并发数量的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

提高单机性能存在两条路线

  1. 减少I/O的阻塞时间
  2. 提高CPU的利用的效率

总结来说就是提高CPU运转的时间和运转的效率

golang实践
对于http标准库, 采用一个请求分配一个goroutine,来减少I/O阻塞的时间,并且goroutine是更加轻量级的执行体(相对于线程和进程)就提高了CPU的效率,因为线程/进程调度,上下文切换的时间要远大于goroutine的时间。但是标准库中并没有控制goroutine的数量

for {
		rw, e := l.Accept()
		if e != nil {
			select {
			case <-srv.getDoneChan():
				return ErrServerClosed
			default:
			}
			if ne, ok := e.(net.Error); ok && ne.Temporary() {
				if tempDelay == 0 {
					tempDelay = 5 * time.Millisecond
				} else {
					tempDelay *= 2
				}
				if max := 1 * time.Second; tempDelay > max {
					tempDelay = max
				}
				srv.logf("http: Accept error: %v; retrying in %v", e, tempDelay)
				time.Sleep(tempDelay)
				continue
			}
			return e
		}
		if cc := srv.ConnContext; cc != nil {
			ctx = cc(ctx, rw)
			if ctx == nil {
				panic("ConnContext returned nil")
			}
		}
		tempDelay = 0
		c := srv.newConn(rw)
		c.setState(c.rwc, StateNew) // before Serve can return
		go c.serve(ctx)
	}

可以上面的的代码块看出,标准库是对每一个conn包装下后通过go关键字启动处理函数,并没有控制goroutine的数量。可以采用goroutine池去处理,例如httprouter

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值