[gev] 一個輕量、快速的基於 Reactor 模式的非阻塞 TCP 網路庫
gev
`gev` 是一個輕量、快速的基於 Reactor 模式的非阻塞 TCP 網路庫。特點
- 基於 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框架
- 一個輕量級的基於RateLimiter的分散式限流實現MIT分散式
- core_framework —— 基於libev的輕量級lua網路開發框架Framework框架
- Soa: 一個輕量級的微服務庫微服務
- 基於 mysql 非同步驅動的非阻塞 Mybatis 瞭解一下MySql非同步MyBatis
- 一個用於建立react+Figma外掛的輕量級的UI庫ReactUI
- 開源一個自用的Android IM庫,基於Netty+TCP+Protobuf實現。AndroidNettyTCP
- 開源一個基於dotnet standard的輕量級的ORM框架-Light.DataORM框架
- DLL:一個炙手可熱的快速深度神經網路庫神經網路
- 基於gogs和drone的一個輕量級的開發部署自動化流程Go
- 對於同步、非同步、阻塞、非阻塞的幾點淺薄理解非同步
- Python 基於 TCP 傳輸協議的網路通訊實現PythonTCP協議
- GeoPackage - 一個簡便輕量的本地地理資料庫Package資料庫
- GJLightBlueTooth——一個輕量級的iOS藍芽開發庫iOS藍芽
- 基於VUE+TypeScript 一個快速開發的移動端UI元件庫VueTypeScriptUI元件
- docker快速建立輕量級的可移植的容器(一)Docker
- Java進階:基於TCP通訊的網路實時聊天室JavaTCP
- 同步、非同步、阻塞、非阻塞的區別非同步
- 一個Java基於阻塞的定時消費記憶體佇列Java記憶體佇列
- epoll 非阻塞IO 邊沿觸發模式模式
- IO - 同步 非同步 阻塞 非阻塞的區別非同步
- Reactor 模式React模式
- Reactor模式React模式
- 基於HTML5 的網際網路+地鐵行業新模式HTML行業模式
- 基於阿里雲輕量應用伺服器快速部署部落格阿里伺服器
- .net core基於HttpClient實現的網路請求庫HTTPclient
- Pekwm:一個輕量級的 Linux 桌面Linux
- 設計一個基於 LSTM 神經網路的文字分類器神經網路文字分類
- 適合移動端的輕量級網路
- 基於 HTML5 網路拓撲圖的快速開發之入門篇(一)HTML
- 基於TCP協議的Socket網路程式設計( )TCP協議程式設計
- 基於 Python + Vue3!一個輕量級的域名和 SSL 證書監測平臺!PythonVue
- 如何開發一個基於 Vue 的 ui 元件庫(一)VueUI元件
- 從linux原始碼看socket的阻塞和非阻塞Linux原始碼
- 從 Linux 原始碼看 socket 的阻塞和非阻塞Linux原始碼
- 同步阻塞、同步非阻塞、多路複用的介紹
- [ gev ] Go 語言優雅處理 TCP “粘包”GoTCP