The gnet
v2.7.0 is officially released!
In this release, most of the core internal packages used by gnet are now available outside of gnet!
Take netpoll
package as an example:
Package netpoll
provides a portable event-driven interface for network I/O.
The underlying facility of event notification is OS-specific:
With the help of the netpoll
package, you can easily build your own high-performance
event-driven network applications based on epoll/kqueue.
The Poller
represents the event notification facility whose backend is epoll or kqueue.
The OpenPoller
function creates a new Poller
instance:
poller, err := netpoll.OpenPoller()
if err != nil {
// handle error
}
defer poller.Close()
addr, err := net.ResolveTCPAddr("tcp", "127.0.0.1:9090")
if err != nil {
// handle error
}
c, err := net.DialTCP("tcp", nil, addr)
if err != nil {
// handle error
}
f, err := c.File()
if err != nil {
// handle error
}
closeClient := func() {
c.Close()
f.Close()
}
defer closeClient()
The PollAttachment
consists of a file descriptor and its callback function.
PollAttachment
is used to register a file descriptor to Poller
.
The callback function is called when an event occurs on the file descriptor:
pa := netpoll.PollAttachment{
FD: int(f.Fd()),
Callback: func(fd int, event netpoll.IOEvent, flags netpoll.IOFlags) error {
if netpoll.IsErrorEvent(event, flags) {
closeClient()
return errors.ErrEngineShutdown
}
if netpoll.IsReadEvent(event) {
buf := make([]byte, 64)
// Read data from the connection.
_, err := c.Read(buf)
if err != nil {
closeClient()
return errors.ErrEngineShutdown
}
// Process the data...
}
if netpoll.IsWriteEvent(event) {
// Write data to the connection.
_, err := c.Write([]byte("hello"))
if err != nil {
closeClient()
return errors.ErrEngineShutdown
}
}
return nil
}}
if err := poller.AddReadWrite(&pa, false); err != nil {
// handle error
}
The Poller.Polling
function starts the event loop monitoring file descriptors and
waiting for I/O events to occur:
poller.Polling(func(fd int, event netpoll.IOEvent, flags netpoll.IOFlags) error {
return pa.Callback(fd, event, flags)
})
Or
poller.Polling()
if you've enabled the build tag poll_opt
.
Check out gnet/pkg for more details.
P.S. Follow me on Twitter @panjf2000 to get the latest updates about gnet!