【译】高性能异步 IO —— io_uring (Effecient IO with io_uring)
- register a file set for io_uring instance
- support file IO
- support socket IO
- support IO timeout
- link request
- set timer
- add request extra info, could get it from the result
- set logger
- register buffers and IO with buffers
- support SQPoll
- Linux Kernel >= 5.6
go get github.com/iceber/iouring-go
package main
import (
        "fmt"
        "os"
        "github.com/iceber/iouring-go"
)
var str = "io with iouring"
func main() {
        iour, err := iouring.New(1)
        if err != nil {
                panic(fmt.Sprintf("new IOURing error: %v", err))
        }
        defer iour.Close()
        file, err := os.Create("./tmp.txt")
        if err != nil {
                panic(err)
        }
        ch := make(chan iouring.Result, 1)
        prepRequest := iouring.Write(int(file.Fd()), []byte(str))
        if _, err := iour.SubmitRequest(prepRequest, ch); err != nil {
                panic(err)
        }
        result := <-ch
        i, err := result.ReturnInt()
        if err != nil {
                fmt.Println("write error: ", err)
                return
        }
        fmt.Printf("write byte: %d\n", i)
}prepRequest := iouring.Write(int(file.Fd()), []byte(str)).WithInfo(file.Name())
request, err := iour.SubmitRequest(prepRequest, nil)
if err != nil {
    panic(err)
}
<- request.Done()
info, ok := request.GetRequestInfo().(string)prepR := iouring.Timeout(5 * time.Second)
request, err := iour.SubmitRequest(prepR, nil)
if err != nil {
    panic(err)
}
if _, err := request.Cancel(); err != nil{
    fmt.Printf("cancel request error: %v\n", err)
    return
}
<- request.Done()
if err := request.Err(); err != nil{
    if err == iouring.ErrRequestCanceled{
        fmt.Println("request is canceled"0
        return
    }
    fmt.Printf("request error: %v\n", err)
    return
}var offset uint64
buf1 := make([]byte, 1024)
prep1:= iouring.Pread(fd, buf1, offset)
offset += 1024
buf2 := make([]byte, 1024)
prep2:= iouring.Pread(fd, buf1, offset)
requests, err := iour.SubmitRequests([]iouring.PrepRequest{prep1,prep2}, nil)
if err != nil{
    panic(err)
}
<- requests.Done()
fmt.Println("requests are completed")requests is concurrent execution
var offset uint64
buf := make([]byte, 1024)
prep1 := iouring.Pread(fd, buf1, offset)
prep2 := iouring.Write(int(os.Stdout.Fd()), buf)
iour.SubmitLinkRequests([]iouring.PrepRequest{prep1, prep2}, nil)- add tests
- arguments type (eg. int and int32)
- set logger