[gev] 一個輕量、快速的基於 Reactor 模式的非阻塞 TCP 網路庫
`gev` 是一個輕量、快速的基於 Reactor 模式的非阻塞 TCP 網路庫。
➡️➡️ https://github.com/Allenxuxu/gev
特點
- 基於 epoll 和 kqueue 實現的高效能事件迴圈 - 支援多核多執行緒 - 動態擴容 Ring Buffer 實現的讀寫緩衝區 - 非同步讀寫 - SO_REUSEPORT 埠重用支援網路模型
`gev` 只使用極少的 goroutine, 一個 goroutine 負責監聽客戶端連線,其他 goroutine (work 協程)負責處理已連線客戶端的讀寫事件,work 協程數量可以配置,預設與執行主機 CPU 數量相同。效能測試
> 測試環境 Ubuntu18.04 | 4 Virtual CPUs | 4.0 GiB吞吐量測試
限制 GOMAXPROCS=1(單執行緒),1 個 work 協程 限制 GOMAXPROCS=4,4 個 work 協程其他測試
速度測試
和同類庫的簡單效能比較, 壓測方式與 evio 專案相同。 - gnet - eviop - evio - net (標準庫) 限制 GOMAXPROCS=1,1 個 work 協程 限制 GOMAXPROCS=1,4 個 work 協程 限制 GOMAXPROCS=4,4 個 work 協程安裝 gev
```bash go get -u github.com/Allenxuxu/gev ```快速入門
```go package main import ( "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(c *connection.Connection) { log.Println("OnClose") } func main() { handler := new(example) s, err := gev.NewServer(handler, gev.Address(":1833"), gev.NumLoops(2), gev.ReusePort(true)) if err != nil { panic(err) } s.Start() } ``` Handler 是一個介面,我們的程式必須實現它。 ```go type Handler interface { OnConnect(c *connection.Connection) OnMessage(c *connection.Connection, buffer *ringbuffer.RingBuffer) []byte OnClose(c *connection.Connection) } func NewServer(handler Handler, opts ...Option) (server *Server, err error) { ``` 在訊息到來時,gev 會回撥 OnMessage ,在這個函式中可以通過返回一個切片來傳送資料給客戶端。 ```go func (s *example) OnMessage(c *connection.Connection, buffer *ringbuffer.RingBuffer) (out []byte) ``` Connection 還提供 Send 方法來傳送資料。Send 並不會立刻傳送資料,而是先新增到 event loop 的任務佇列中,然後喚醒 event loop 去傳送。 更詳細的使用方式可以參考示例:[服務端定時推送] ```go func (c *Connection) Send(buffer []byte) error ``` Connection ShutdownWrite 會關閉寫端,從而斷開連線。 更詳細的使用方式可以參考示例:[限制最大連線數] ```go func (c *Connection) ShutdownWrite() error ```
➡️➡️ https://github.com/Allenxuxu/gev
相關文章
- [開源] gev (支援 websocket 啦): Go 實現基於 Reactor 模式的非阻塞網路庫WebGoReact模式
- 一個工業級、跨平臺、輕量級的 tcp 網路服務框架:geventTCP框架
- 基於ObjC的輕量級Promise庫——RWPromiseKitOBJPromise
- 基於CAS操作的非阻塞演算法演算法
- 一個輕量級的基於RateLimiter的分散式限流實現MIT分散式
- Soa: 一個輕量級的微服務庫微服務
- 建立一個Twisted Reactor TCP客戶端ReactTCP客戶端
- muduo網路庫學習筆記(9):Reactor模式的關鍵結構筆記React模式
- core_framework —— 基於libev的輕量級lua網路開發框架Framework框架
- 網路IO之阻塞、非阻塞、同步、非同步總結非同步
- 基於 mysql 非同步驅動的非阻塞 Mybatis 瞭解一下MySql非同步MyBatis
- 一個用於建立react+Figma外掛的輕量級的UI庫ReactUI
- 阻塞/非阻塞讀寫總結、tcp網路程式設計的本質、muduo::Buffer設計簡介TCP程式設計
- 基於gogs和drone的一個輕量級的開發部署自動化流程Go
- Uvicorn 初體驗-一個基於 asyncio 開發的一個輕量級高效的 Web 伺服器框架Web伺服器框架
- faked一個用於mock後端API的輕量工具Mock後端API
- 開源一個基於dotnet standard的輕量級的ORM框架-Light.DataORM框架
- GeoPackage - 一個簡便輕量的本地地理資料庫Package資料庫
- 對於同步、非同步、阻塞、非阻塞的幾點淺薄理解非同步
- DLL:一個炙手可熱的快速深度神經網路庫神經網路
- docker快速建立輕量級的可移植的容器(一)Docker
- 開源一個自用的Android IM庫,基於Netty+TCP+Protobuf實現。AndroidNettyTCP
- GJLightBlueTooth——一個輕量級的iOS藍芽開發庫iOS藍芽
- GraphicsJS 入門,一個輕量級的前端圖形庫JS前端
- 5個替代Apache和IIS的輕量級網路伺服器Apache伺服器
- 相容tcp和websocket的一個簡潔網路框架gettyTCPWeb框架
- 基於VUE+TypeScript 一個快速開發的移動端UI元件庫VueTypeScriptUI元件
- 同步、非同步、阻塞、非阻塞的區別非同步
- TCP/IP基礎知識&Oracle的TCP/IP網路應用TCPOracle
- 一個Java基於阻塞的定時消費記憶體佇列Java記憶體佇列
- Java進階:基於TCP通訊的網路實時聊天室JavaTCP
- Python 基於 TCP 傳輸協議的網路通訊實現PythonTCP協議
- 適合移動端的輕量級網路
- SimpleRpc-網路事件響應Reactor設計模式RPC事件React設計模式
- 策劃一個基於網路的專案管理系統(轉)專案管理
- Fastflow——基於golang的輕量級工作流框架ASTGolang框架
- 基於滴滴雲搭建輕量文件網站生成工具 Docsify網站
- 基於阿里雲輕量應用伺服器快速部署部落格阿里伺服器