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

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

  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

你可能感兴趣的:(总结,golang,面试)