Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/panjf2000/gnet
🚀 gnet is a high-performance, lightweight, non-blocking, event-driven networking framework written in pure Go./ gnet 是一个高性能、轻量级、非阻塞的事件驱动 Go 网络框架。
https://github.com/panjf2000/gnet
async asynchronous epoll event-driven event-loop go golang goroutine io kqueue network networking non-blocking reactor tcp udp
Last synced: 7 days ago
JSON representation
🚀 gnet is a high-performance, lightweight, non-blocking, event-driven networking framework written in pure Go./ gnet 是一个高性能、轻量级、非阻塞的事件驱动 Go 网络框架。
- Host: GitHub
- URL: https://github.com/panjf2000/gnet
- Owner: panjf2000
- License: apache-2.0
- Created: 2019-02-24T03:48:45.000Z (over 5 years ago)
- Default Branch: dev
- Last Pushed: 2024-05-01T03:07:41.000Z (6 months ago)
- Last Synced: 2024-05-02T01:09:24.038Z (6 months ago)
- Topics: async, asynchronous, epoll, event-driven, event-loop, go, golang, goroutine, io, kqueue, network, networking, non-blocking, reactor, tcp, udp
- Language: Go
- Homepage: https://gnet.host
- Size: 33.1 MB
- Stars: 9,081
- Watchers: 164
- Forks: 998
- Open Issues: 35
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- Funding: .github/FUNDING.yml
- License: LICENSE
- Code of conduct: CODE_OF_CONDUCT.md
Awesome Lists containing this project
- awesome-go - gnet - `gnet` is a high-performance, lightweight, non-blocking, event-driven networking framework written in pure Go. (Networking / Transliteration)
- awesome-go - panjf2000/gnet - performance, lightweight, non-blocking, event-driven networking framework written in pure Go./ gnet 是一个高性能、轻量级、非阻塞的事件驱动 Go 网络框架。|7,660| (Popular)
- zero-alloc-awesome-go - gnet - `gnet` is a high-performance, lightweight, non-blocking, event-driven networking framework written in pure Go. (Networking / Transliteration)
- awesome-go-perf - gnet - high-performance, lightweight, non-blocking, event-driven networking framework written in pure Go. (Network)
- go-awesome - gnet - Event driven Go network framework (Open source library / The Internet)
- awesome-go - gnet - `gnet` is a high-performance, lightweight, non-blocking, event-driven networking framework written in pure Go. Stars:`9.6K`. (Networking / Transliteration)
- awesome-hacking-lists - panjf2000/gnet - 🚀 gnet is a high-performance, lightweight, non-blocking, event-driven networking framework written in pure Go. (Go)
- my-awesome - panjf2000/gnet - driven,event-loop,go,golang,goroutine,io,kqueue,network,networking,non-blocking,reactor,tcp,udp pushed_at:2024-10 star:9.6k fork:1.0k 🚀 gnet is a high-performance, lightweight, non-blocking, event-driven networking framework written in pure Go. (Go)
- awesome-golang-repositories - gnet - performance, lightweight, non-blocking, event-driven networking framework written in pure Go./ gnet �ス閾ュ�ス驫晁換�ス�ス謇ッ�搾ソス錡セ陜�ス譿ウ貍」�ス錡ソ�ス�ス鬢�ソス�ス�托ソス髫槫恍蠎暦ソス�ス Go 陜オ﨣ュ�ス迯「�咋エオ�ス�ス (Repositories)
- awesome-go-extra - gnet - performance, lightweight, non-blocking, event-driven networking framework written in pure Go./ gnet 是一个高性能、轻量级、非阻塞的事件驱动 Go 网络框架。|6849|802|41|2019-02-24T03:48:45Z|2022-08-09T15:39:50Z| (Networking / Uncategorized)
README
English | [中文](README_ZH.md)
### 🎉🎉🎉 Feel free to join [the channels about `gnet` on the Discord Server](https://discord.gg/UyKD7NZcfH).
# 📖 Introduction
`gnet` is an event-driven networking framework that is ultra-fast and lightweight. It is built from scratch by exploiting [epoll](https://man7.org/linux/man-pages/man7/epoll.7.html) and [kqueue](https://en.wikipedia.org/wiki/Kqueue) and it can achieve much higher performance with lower memory consumption than Go [net](https://golang.org/pkg/net/) in many specific scenarios.
`gnet` and [net](https://golang.org/pkg/net/) don't share the same philosophy about network programming. Thus, building network applications with `gnet` can be significantly different from building them with [net](https://golang.org/pkg/net/), and the philosophies can't be reconciled. There are other similar products written in other programming languages in the community, such as [libuv](https://github.com/libuv/libuv), [netty](https://github.com/netty/netty), [twisted](https://github.com/twisted/twisted), [tornado](https://github.com/tornadoweb/tornado), etc. which work in a similar pattern as `gnet` under the hood.
`gnet` is not designed to displace the Go [net](https://golang.org/pkg/net/), but to create an alternative in the Go ecosystem for building performance-critical network services. As a result of which, `gnet` is not as comprehensive as Go [net](https://golang.org/pkg/net/), it provides only the core functionality (via a concise set of APIs) required by a network application and it doesn't plan on becoming a coverall networking framework, as I think Go [net](https://golang.org/pkg/net/) has done a good enough job in that area.
`gnet` sells itself as a high-performance, lightweight, non-blocking, event-driven networking framework written in pure Go which works on the transport layer with TCP/UDP protocols and Unix Domain Socket. It enables developers to implement their own protocols(HTTP, RPC, WebSocket, Redis, etc.) of application layer upon `gnet` for building diversified network services. For instance, you get an HTTP Server if you implement HTTP protocol upon `gnet` while you have a Redis Server done with the implementation of Redis protocol upon `gnet` and so on.
**`gnet` derives from the project: `evio` with much higher performance and more features.**
# 🚀 Features
## 🦖 Milestone
- [x] [High-performance](#-performance) event-driven looping based on a networking model of multiple threads/goroutines
- [x] Built-in goroutine pool powered by the library [ants](https://github.com/panjf2000/ants)
- [x] Lock-free during the entire runtime
- [x] Concise and easy-to-use APIs
- [x] Efficient, reusable, and elastic memory buffer: (Elastic-)Ring-Buffer, Linked-List-Buffer and Elastic-Mixed-Buffer
- [x] Multiple protocols/IPC mechanisms: `TCP`, `UDP`, and `Unix Domain Socket`
- [x] Multiple load-balancing algorithms: `Round-Robin`, `Source-Addr-Hash`, and `Least-Connections`
- [x] Flexible ticker event
- [x] `gnet` client
- [x] Running on `Linux`, `macOS`, `Windows`, and *BSD: `Darwin`/`DragonFlyBSD`/`FreeBSD`/`NetBSD`/`OpenBSD`
- [x] **Edge-triggered** I/O support
- [x] Multiple network addresses binding## 🕊 Roadmap
- [ ] **TLS** support
- [ ] [io_uring](https://github.com/axboe/liburing/wiki/io_uring-and-networking-in-2023) support
- [ ] **KCP** support***Windows version of `gnet` should only be used in development for developing and testing, it shouldn't be used in production.***
# 🎬 Getting started
`gnet` is available as a Go module and we highly recommend that you use `gnet` via [Go Modules](https://go.dev/blog/using-go-modules), with Go 1.11 Modules enabled (Go 1.11+), you can just simply add `import "github.com/panjf2000/gnet/v2"` to the codebase and run `go mod download/go mod tidy` or `go [build|run|test]` to download the necessary dependencies automatically.
## With v2
```bash
go get -u github.com/panjf2000/gnet/v2
```## With v1
```bash
go get -u github.com/panjf2000/gnet
```# 🎡 Use cases
The following corporations/organizations use `gnet` as the underlying network service in production.
If you're also using `gnet` in production, please help us enrich this list by opening a pull request.
# 📊 Performance
## Benchmarks on TechEmpower
```bash
# Hardware Environment
* 28 HT Cores Intel(R) Xeon(R) Gold 5120 CPU @ 3.20GHz
* 32GB RAM
* Dedicated Cisco 10-gigabit Ethernet switch
* Debian 12 "bookworm"
* Go1.19.x linux/amd64
```![](https://raw.githubusercontent.com/panjf2000/illustrations/master/benchmark/techempower-plaintext-top50-light.jpg)
This is a leaderboard of the top ***50*** out of ***486*** frameworks that encompass various programming languages worldwide, in which `gnet` is ranked ***first***.
![](https://raw.githubusercontent.com/panjf2000/illustrations/master/benchmark/techempower-plaintext-topN-go-light.png)
This is the full framework ranking of Go and `gnet` tops all the other frameworks, which makes `gnet` the ***fastest*** networking framework in Go.
To see the full ranking list, visit [TechEmpower Benchmark **Round 22**](https://www.techempower.com/benchmarks/#hw=ph&test=plaintext§ion=data-r22).
***Note that the HTTP implementation of gnet on TechEmpower is half-baked and fine-tuned for benchmark purposes only and far from production-ready.***
## Contrasts to the similar networking libraries
## On Linux (epoll)
### Test Environment
```bash
# Machine information
OS : Ubuntu 20.04/x86_64
CPU : 8 CPU cores, AMD EPYC 7K62 48-Core Processor
Memory : 16.0 GiB# Go version and settings
Go Version : go1.17.2 linux/amd64
GOMAXPROCS : 8# Benchmark parameters
TCP connections : 1000/2000/5000/10000
Packet size : 512/1024/2048/4096/8192/16384/32768/65536 bytes
Test duration : 15s
```#### [Echo benchmark](https://github.com/gnet-io/gnet-benchmarks)
![](https://github.com/panjf2000/gnet_benchmarks/raw/master/results/echo_conn_linux.png)
![](https://github.com/panjf2000/gnet_benchmarks/raw/master/results/echo_packet_linux.png)
## On MacOS (kqueue)
### Test Environment
```bash
# Machine information
OS : MacOS Big Sur/x86_64
CPU : 6 CPU cores, Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
Memory : 16.0 GiB# Go version and settings
Go Version : go1.16.5 darwin/amd64
GOMAXPROCS : 12# Benchmark parameters
TCP connections : 300/400/500/600/700
Packet size : 512/1024/2048/4096/8192 bytes
Test duration : 15s
```#### [Echo benchmark](https://github.com/gnet-io/gnet-benchmarks)
![](https://github.com/panjf2000/gnet_benchmarks/raw/master/results/echo_conn_macos.png)
![](https://github.com/panjf2000/gnet_benchmarks/raw/master/results/echo_packet_macos.png)
# ⚠️ License
The source code of `gnet` should be distributed under the Apache-2.0 license.
# 👏 Contributors
Please read the [Contributing Guidelines](CONTRIBUTING.md) before opening a PR and thank you to all the developers who already made contributions to `gnet`!
# ⚓ Relevant Articles
- [A Million WebSockets and Go](https://www.freecodecamp.org/news/million-websockets-and-go-cc58418460bb/)
- [Going Infinite, handling 1M websockets connections in Go](https://speakerdeck.com/eranyanay/going-infinite-handling-1m-websockets-connections-in-go)
- [Go netpoller 原生网络模型之源码全面揭秘](https://strikefreedom.top/go-netpoll-io-multiplexing-reactor)
- [gnet: 一个轻量级且高性能的 Golang 网络库](https://strikefreedom.top/go-event-loop-networking-library-gnet)
- [最快的 Go 网络框架 gnet 来啦!](https://strikefreedom.top/releasing-gnet-v1-with-techempower)# 💰 Backers
Support us with a monthly donation and help us continue our activities.
# 💎 Sponsors
Become a bronze sponsor with a monthly donation of $10 and get your logo on our README on GitHub.
# ☕️ Buy me a coffee
> Please be sure to leave your name, GitHub account, or other social media accounts when you donate by the following means so that I can add it to the list of donors as a token of my appreciation.
# 🔑 JetBrains OS licenses
`gnet` has been being developed with `GoLand` IDE under the ***free JetBrains Open Source license(s)*** granted by JetBrains s.r.o., hence I would like to express my thanks here.
# 🔋 Sponsorship
This project is supported by: