gev 轻量、快速的 Golang 网络库

gev 是一个轻量、快速的基于 Reactor 模式的非阻塞 TCP 网络库,底层并不使用 golang net 库,而是使用 epoll 和 kqueue,因此它并不支持 Windows。

为什么有 gev

Golang 的 goroutine 虽然非常轻量,但是每启动一个 goroutine 仍需要 4k 左右的内存。读了鸟窝大佬的文章【百万 Go TCP 连接的思考: epoll方式减少资源占用】后,便去研究了了下 evio。

evio 虽然非常快,但是仍然存在一些问题,便尝试去优化它,于是有了 eviop 项目。关于 evio 的问题可以看我的另一篇博文 【Golang 网络库evio一些问题/bug和思考】。在优化 evio 完成 eviop 的过程中,因为其网络模型的缘故,愈加感觉修改它非常麻烦,成本比重新搞一个还高。

最终决定自己重搞一个,更加轻量,不需要的全去掉。加上大学时学习过 muduo ,便参考 muduo 的使用的 Reactor 模型实现 gev 。

在 linux 环境下,gev 底层使用 epoll ,这是 gev 会专注优化的地方。在 mac 下底层使用 kqueue,可能不会过多关注这部分的优化,毕竟很少有用 mac 做服务器的(Windows 环境"暂"不支持)。

特点

基于 epoll 和 kqueue 实现的高性能事件循环

支持多核多线程

动态扩容 Ring Buffer 实现的读写缓冲区

异步读写

SO_REUSEPORT 端口重用支持

网络模型

gev 只使用极少的 goroutine, 一个 goroutine 负责监听客户端连接,其他 goroutine (work 协程)负责处理已连接客户端的读写事件,work 协程数量可以配置,默认与运行主机 CPU 数量相同。

性能测试

测试环境 Ubuntu18.04

和同类库的简单性能比较, 压测方式与 evio 项目相同。

gnet

eviop

evio

net (标准库)

限制 GOMAXPROCS=1,1 个 work 协程

限制 GOMAXPROCS=1,4 个 work 协程

限制 GOMAXPROCS=4,4 个 work 协程

安装

go get -u github.com/Allenxuxu/gev

复制代码

示例

package main

import (

"flag"

"strconv"

"log"

"github.com/Allenxuxu/gev"

"github.com/Allenxuxu/gev/connection"

"github.com/Allenxuxu/ringbuffer"

)

type example struct{}

func (s *example) OnConnect(c *connection.Connection) {

log.Println(" OnConnect : ", c.PeerAddr())

}

func (s *example) OnMessage(c *connection.Connection, buffer *ringbuffer.RingBuffer) (out []byte) {

//log.Println("OnMessage")

first, end := buffer.PeekAll()

out = first

if len(end) > 0 {

out = append(out, end...)

}

buffer.RetrieveAll()

return

}

func (s *example) OnClose() {

log.Println("OnClose")

}

func main() {

handler := new(example)

var port int

var loops int

flag.IntVar(&port, "port", 1833, "server port")

flag.IntVar(&loops, "loops", -1, "num loops")

flag.Parse()

s, err := gev.NewServer(handler,

gev.Network("tcp"),

gev.Address(":"+strconv.Itoa(port)),

gev.NumLoops(loops))

if err != nil {

panic(err)

}

s.Start()

}

复制代码

参考

本项目受 evio 启发,参考 muduo 实现。

相关文章

有疑问加站长微信联系(非本文作者)

golang mysql 非阻塞_Golang 实现轻量、快速的基于 Reactor 模式的非阻塞 TCP 网络库...相关推荐

  1. 【gev】 Golang 实现轻量、快速的基于 Reactor 模式的非阻塞 TCP 网络库

    gev 轻量.快速的 Golang 网络库 https://github.com/Allenxuxu/gev gev 是一个轻量.快速的基于 Reactor 模式的非阻塞 TCP 网络库,底层并不使用 ...

  2. android快速开发框架_【程序源代码】springboot和ssm的极速轻量快速开发框架

    关键字:java springboot 简单框架 正文 | 内容 01 - [介绍] jeexjj基于springboot和ssm的极速轻量快速开发框架,能够根据数据库生成单表和一对多表的增删改查代码 ...

  3. 腾讯云轻量快速搭建个人网盘

    腾讯云轻量快速搭建个人网盘 现在市面上的网盘大多数都限速,并且文件可能不安全,所以拥有一个自己的服务器就可以搭建轻便的个人网盘了,最方便的是你不需要任何tx服务器的知识,因为腾讯云轻量应用服务器已经把 ...

  4. 轻量快速的CI工具Drone快速入门

    前言 公司之前一直在使用 Jenkins 作为 CI/CD 工具, Jenkins 非常强大,它完成了几乎所有 CI/CD 的工作,并且应用于整个团队有好长一段时间了.但是随着公司推荐数字化.智慧化, ...

  5. golang MySQL 占内存_golang操作mysql使用总结

    前言 Golang 提供了database/sql包用于对SQL数据库的访问, 作为操作数据库的入口对象sql.DB, 主要为我们提供了两个重要的功能: sql.DB 通过数据库驱动为我们提供管理底层 ...

  6. golang mysql大量连接_golang mysql 如何设置最大连接数和最大空闲连接数

    本文介绍golang 中连接MySQL时,如何设置最大连接数和最大空闲连接数. 关于最大连接数和最大空闲连接数,是定义在golang标准库中database/sql的. 文中例子连接MySQL用的SQ ...

  7. golang mysql 工具类_golang操作mysql使用总结

    sql.DB 通过数据库驱动为我们提供管理底层数据库连接的打开和关闭操作. sql.DB 为我们管理数据库连接池 需要注意的是,sql.DB表示操作数据库的抽象访问接口,而非一个数据库连接对象;它可以 ...

  8. golang mysql大量写入_Golang 实现分片读取http超大文件流和并发控制

    分片读取http超大文件流 Golang中的HTTP发送get请求,在获取内容有两种情况. Golang发送http get请求方式 resp, err := http.Get(sendUrl) if ...

  9. 基于scratch构建轻量快速镜像

    设计背景: 由于项目所限定的运行平台生态所限,没有良好的容器镜像支持无父镜像可以依赖(不像X86.ARM平台),且项目对容器镜像的启动时间和镜像大小的要求,所以需要从零开始构建镜像. docker的镜 ...

最新文章

  1. 如何防止果照外泄?自己先上传就OK!扎克伯格这波操作给网友整不会了
  2. python获取一个模块的路径_如何获取 Python 模块的路径
  3. 移动平台MOBA发热与帧率优化
  4. LeetCode之Sum of Two Integers
  5. python根据财务指标寻找价值股票
  6. 在CentOs7上yum安装redis
  7. linux里面的perl脚本怎么调用函数,如何在我的Perl脚本中包含另一个文件的函数?...
  8. NASM汇编语言与计算机系统09-8086实模式的内存分配图
  9. 昆仑通态如何连接sqlserver数据库_三菱FX5U 与昆仑通态触摸屏的连接操作步骤
  10. 异步处理函数async_Spring @Async异步处理注释
  11. luogu_P4767 [IOI2000]邮局
  12. Android jdwp 自动断开,android – 安装调试器有时会导致应用程序崩溃
  13. 阿里巴巴大数据实践:大数据建设方法论OneData
  14. 论文阅读:[2019 TSE] A Theoretical and Empirical Analysis of Program Spectra Diagnosability
  15. 学习Hibernate框架笔记-第2天
  16. Tecplot操作记录
  17. 3GPP TS 23502-h20 中英文对照 | 4.4.1.3 N4 Session Modification procedure
  18. 智能的尴尬--《命名和指称》
  19. java eles什么意思_Springboot 那么大,不用什么场景都用它吧,要不尝试下 Mars- Java ?...
  20. image 微信小程序flex_微信小程序入门教程之二:页面样式

热门文章

  1. android 监控行为,一种针对Android系统App行为的监控方法
  2. android 高德拖拽地图定位,拖拽选址-拖拽选址-示例中心-JS API UI 组件示例 | 高德地图API...
  3. dwm.exe(桌面窗口管理器)占用内存过大解决办法
  4. 沙漠帕拉萨德别墅室内外Corona建筑作品赏析
  5. Arduino与人体感应模块
  6. Python 第三方模块 机器学习 Scikit-Learn模块 有监督学习1 交叉分解,高斯过程,保序回归
  7. 流程审批: 有个人不走申请人直属领导审批,审批流程设定(设定条件,矩阵相关)
  8. centos下申请阿里云泛域名证书并自动更新
  9. 关于Scrapy爬虫框架中meta参数的使用示例演示(下)
  10. 【计算机毕业设计】123网上商城系统的设计与实现