golang学习笔记(二)

  • worker pool(goroutine池):Go语言中的goroutine虽然相对于系统线程来说比较轻量级,但是在高并发量下的goroutine频繁创建和销毁对于性能损耗以及GC来说压力也不小。充分将goroutine复用,减少goroutine的创建/销毁的性能损耗,这便是grpool对goroutine进行池化封装的目的。例如,针对于100W个执行任务,使用goroutine的话需要不停创建并销毁100W个goroutine,而使用grpool也许底层只需要几千个goroutine便能充分复用地执行完成所有任务。经测试,在高并发下grpool的性能比原生的goroutine高出几倍到数百倍!并且随之也极大地降低了内存使用率。
  • select多路复用:从多个通道取值的操作。
  • goroutine是用户态的线程。
  • golang默认跑满cpu,一般日志服务要设置核心数,一般占用一个核心即可。
  • https://www.liwenzhou.com/images/Go/concurrence/channel01.png channel的各种情况
  • channel是一种类型,一种引用类型。
  • channel读和存的时候都可以套上select,免得当前goroutine卡住。
  • golang的:互斥锁:只有一个goroutine访问共享资源。sync的mutex。
  • 互斥锁的根本就是当一个goroutine访问的时候,其他goroutine都不能访问,这样肯定保证了资源的同步,避免了竞争,不过也降低了性能。当我们读取一个数据的时候,如果这个数据永远不会被修改,那么其实是不存在资源竞争的问题的,因为数据是不变的,不管怎么读取,多少goroutine同时读取,都是可以的。读写锁可以让多个读操作同时并发,同时读取,但是对于写操作是完全互斥的。也就是说,当一个goroutine进行写操作的时候,其他goroutine既不能进行读操作,也不能进行写操作。使用读写锁进行控制,可以多读,但是只能有一个写。频繁读的时候可以考虑读写锁。
  • sync.once 初始化的时候可以考虑使用。
  • map不是并发安全的。sync.map可以考虑使用(内置方法和map略有不同)。
  • 原子操作(与锁实现的效果类似)
  • socket编程,用于描述ip地址和端口。
  • 物理层:实物层(光纤等)
  • udp可以用来做直播。udp是无连接的传输层协议。
  • os.args可以用来构建脚本。
  • tcp粘包,tcp是一个流式协议。会出现粘包是因为同时可能会发两段数据。大端和小端。计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian)。答案是,计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的。所以,计算机的内部处理都是小端字节序。但是,人类还是习惯读写大端字节序。所以,除了计算机的内部处理,其他的场合几乎都是大端字节序,比如网络传输和文件储存。只有读取时需要连续读取超过一个字节数据时才需要考虑字节序问题。计算机系统中,是以字节为单位的,每个地址单元对应着一个字节(8bit)。在网络上传输数据时,由于数据传输的两端对应不同的硬件平台,采用的存储字节顺序可能不一致。所以在TCP/IP协议规定了在网络上必须采用网络字节顺序,也就是大端模式。一般操作系统都是小端,Java和所有的网络通讯协议都是使用Big-Endian的编码。
  • 分布式:一个业务分拆多个子业务,部署在不同的服务器上
    集群:同一个业务,部署在多个服务器上
    golang学习笔记(二)_第1张图片
  • 注释/日志/单元测试
  • 默认端口号:sqlserver: 1433
    MySQL: 3306
    Oracle : 1521
    http: 80
    https: 443
    redis: 6379
  • 8080端口同80端口,是被用于WWW代理服务的,可以实现网页浏览,经常在访问某个网站或使用代理服务器的时候,会加上“:8080”端口号。另外Apache Tomcat web server安装后,默认的服务端口就是8080.
  • golang的http服务实现的很棒,如果是简单的脚本的话,可以考虑直接用golang实现http服务。
  • go语言的urlencode编码使用方式
  • 请求不是特别频繁,用完就关闭链接。可以考虑禁用keeplive。
  • 开发自己给自己的代码写测试,单元测试。平时写代码最好不要以_test.go结尾。先写测试用例,当后面改动了业务逻辑的时候,用测试用例测试一下。go test -cover 表示测试覆盖率。go自带了一连串测试用例的用法。
  • golang基准测试(benchmark)。
  • https://www.liwenzhou.com/posts/Go/performance_optimisation/ 在计算机性能调试领域里,profiling 是指对应用程序的画像,画像就是应用程序使用 CPU 和内存的情况。 Go语言是一个对性能特别看重的语言,因此语言中自带了 profiling 的库。注意,我们只应该在性能测试的时候才在代码中引入pprof。

你可能感兴趣的:(golang)