Golang 标签

Go netpoll I/O 多路复用构建原生网络模型之源码深度解析 置顶!

  |   0 评论   |   899 浏览

本文将基于 Linux 平台来解析 Go netpoll 之 I/O 多路复用的底层是如何基于 epoll 封装实现的,从源码层层推进,全面而深度地解析 Go netpoll 的设计理念和实现原理,以及 Go 是如何利用netpoll来构建它的原生网络模型的。主要涉及到的一些概念:I/O 模式、用户/内核空间、epoll、Linux 源码、goroutine scheduler 等等,我会尽量简单地讲解,如果有对相关概念不熟悉的同学,还是希望能提前熟悉一下。

gnet: 一个轻量级且高性能的 Go 网络框架 置顶!

  |   9 评论   |   7,447 浏览

gnet 是一个基于 Event-Loop 事件驱动的高性能和轻量级网络库。这个库直接使用 epollkqueue 系统调用而非标准 Golang 网络包:net 来构建网络应用,它的工作原理类似两个开源的网络库:libuvlibevent

这个项目存在的价值是提供一个在网络包处理方面能和 RedisHaproxy 这两个项目具有相近性能的 Go 语言网络服务器框架。

gnet 的亮点在于它是一个高性能、轻量级、非阻塞的纯 Go 实现的网络库。

Goroutine 并发调度模型深度解析之手撸一个高性能协程池 置顶!

  |   33 评论   |   59,115 浏览

并发(并行),一直以来都是一个编程语言里的核心主题之一,也是被开发者关注最多的话题;Go 语言作为一个出道以来就自带 『高并发』光环的富二代编程语言,它的并发(并行)编程肯定是值得开发者去探究的,而 Go 语言中的并发(并行)编程是经由 goroutine 实现的,goroutine 是 golang 最重要的特性之一,具有使用成本低、消耗资源低、能效高等特点,官方宣称原生 goroutine 并发成千上万不成问题,于是它也成为 Gopher 们经常使用的特性。

Goroutine 是优秀的,但不是完美的,在极大规模的高并发场景下,也可能会暴露出问题,什么问题呢?又有什么可选的解决方案?本文将通过 runtime 对 goroutine 的调度分析,帮助大家理解它的机理和发现一些内存和调度的原理和问题,并且基于此提出一种个人的解决方案 — 一个高性能的 Goroutine Pool(协程池)。

G-P-M模型

深入golang之---goroutine并发控制与通信

  |   2 评论   |   13,008 浏览

Context调用链路

开发 go 程序的时候,时常需要使用 goroutine 并发处理任务,有时候这些 goroutine 是相互独立的,而有的时候,多个 goroutine 之间常常是需要同步与通信的。另一种情况,主 goroutine 需要控制它所属的子 goroutine,总结起来,实现多个 goroutine 间的同步与通信大致有:

  • 全局共享变量
  • channel 通信(CSP 模型)
  • Context 包

本文章通过 goroutine 同步与通信的一个典型场景-通知子 goroutine 退出运行,来深入讲解下 golang 的控制并发。

通知多个子 goroutine 退出运行

goroutine 作为 go 语言的并发利器,不仅性能强劲而且使用方便:只需要一个关键字 go 即可将普通函数并发执行,且 goroutine 占用内存极小(一个 goroutine 只占 2KB 的内存),所以开发 go 程序的时候很多开发者常常会使用这个并发工具,独立的并发任务比较简单,只需要用 go 关键字修饰函数就可以启用一个 goroutine 直接运行;但是,实际的并发场景常常是需要进行协程间的同步与通信,以及精确控制子 goroutine 开始和