Abel'Blog

我干了什么?究竟拿了时间换了什么?

0%

go-gnet

简介

阅读gnet相关知识。

gnet不直接使用go net里面的原有实现,而是直接去通过底层调用epollkqueue函数(这样简直就是将go当成c语言来写,直接调用系统级的函数。在Windows下没有将iocp实现)。底层也是在模仿nettylibvu提供了事件驱动逻辑。

安装

go get -u github.com/panjf2000/gnet

原理

这里重点看一下常用的linux环境下的network的实现。

server

server_unix

数据结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
type server struct {
ln *listener // the listener for accepting new connections
lb loadBalancer // event-loops for handling events
wg sync.WaitGroup // event-loop close WaitGroup
opts *Options // options with server
once sync.Once // make sure only signalShutdown once
cond *sync.Cond // shutdown signaler
codec ICodec // codec for TCP stream
mainLoop *eventloop // main event-loop for accepting connections
inShutdown int32 // whether the server is in shutdown
tickerCtx context.Context // context for ticker
cancelTicker context.CancelFunc // function to stop the ticker
eventHandler EventHandler // user eventHandler
}

组织了服务器的基本元素。listener监听对象;EventHandler消息dispatch的;编码器;退出相关的组件;接受socket的事件处理;退出的逻辑。

acceptor

listener_unix.go

1
2
3
4
5
6
7
8
type listener struct {
once sync.Once
fd int
lnaddr net.Addr
addr, network string
sockopts []socket.Option
pollAttachment *netpoll.PollAttachment // listener attachment for poller
}

类似于之前写c++的时的写法,将accept的socket挂载到epoll里面,等着有事件通知的时候,回调loopAccept函数。

reactor

reactor_default_linux.go

引用