go启用prefork
gin
package main
import (
"flag"
"fmt"
"github.com/gin-gonic/gin"
"github.com/valyala/fasthttp/reuseport"
"log"
"net"
"net/http"
"os"
"os/exec"
"runtime"
)
var (
child = flag.Bool("child", false, "is child proc")
)
func main() {
flag.Parse()
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "pong",
})
})
if err := r.RunListener(getListener(":8080")); err != nil {
log.Fatalf("Error in ListenAndServe: %s", err)
}
}
func getListener(addr string) net.Listener {
if !*child {
children := make([]*exec.Cmd, runtime.NumCPU())
for i := range children {
if runtime.GOOS == "windows" {
children[i] = exec.Command(os.Args[0], "-child")
} else {
children[i] = exec.Command("taskset", "-c", fmt.Sprintf("%d", i), os.Args[0], "-child")
}
children[i].Stdout = os.Stdout
children[i].Stderr = os.Stderr
if err := children[i].Start(); err != nil {
log.Fatal(err)
}
}
for _, ch := range children {
if err := ch.Wait(); err != nil {
log.Print(err)
}
}
os.Exit(0)
panic("unreachable")
}
runtime.GOMAXPROCS(1)
ln, err := reuseport.Listen("tcp4", addr)
if err != nil {
log.Fatal(err)
}
return ln
}
atreugo
package main
import (
"github.com/savsgio/atreugo/v11"
)
func main() {
config := atreugo.Config{
Prefork: true,
Reuseport: true,
Addr: "0.0.0.0:8080",
}
server := atreugo.New(config)
server.GET("/", func(ctx *atreugo.RequestCtx) error {
return ctx.TextResponse("Hello World")
})
server.GET("/echo/{path:*}", func(ctx *atreugo.RequestCtx) error {
return ctx.TextResponse("Echo message: " + ctx.UserValue("path").(string))
})
v1 := server.NewGroupPath("/v1")
v1.GET("/", func(ctx *atreugo.RequestCtx) error {
return ctx.TextResponse("Hello V1 Group")
})
if err := server.ListenAndServe(); err != nil {
panic(err)
}
}
fiber
package main
import "github.com/gofiber/fiber/v2"
func main() {
app := fiber.New(fiber.Config{
Prefork: true,
CaseSensitive: true,
StrictRouting: true,
ServerHeader: "Fiber",
AppName: "Test App v1.0.1",
})
app.Get("/", func(c *fiber.Ctx) error {
return c.SendString("Hello, World!")
})
app.Listen(":8080")
}
hertz(不支持windows)
package main
import (
"context"
"github.com/cloudwego/hertz/pkg/app"
"github.com/cloudwego/hertz/pkg/app/server"
"github.com/cloudwego/hertz/pkg/network/standard"
"github.com/cloudwego/hertz/pkg/protocol/consts"
cxcputhread "github.com/cloudxaas/gocpu/thread"
cxstrconv "github.com/cloudxaas/gostrconv"
"github.com/panjf2000/ants/v2"
"golang.org/x/sys/unix"
"log"
"net"
"os"
"os/exec"
"runtime"
"syscall"
)
func main() {
var err error
if cxcputhread.CPUThread == 0 {
childs := uint16(runtime.GOMAXPROCS(-1)) // Start a child for each CPU.
ids := make(chan uint16, childs)
var i uint16
for i = 0; i < childs; i++ {
ids <- i + 1
}
for id := range ids {
idP := id
ants.Submit(func() {
cmd := exec.Command(os.Args[0], append(os.Args[1:], "-t="+cxstrconv.Uint16toa(idP))...)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
log.Printf("id: %d", idP)
err := cmd.Run()
//time.Sleep(1*time.Second)
log.Printf("%s %s child %d exited with error: %v\n", os.Args[0], os.Args[1:], idP, err)
//time.Sleep(100*time.Second)
ids <- idP // When a child dies we just restart it.
})
}
}
runtime.GOMAXPROCS(1)
err = cxcputhread.SetCPUAffinity(cxcputhread.CPUThread)
if err != nil {
panic(err)
}
// The default listening port is 8888.
// You can modify it with server.WithHostPorts().
h := server.Default(
server.WithHostPorts("127.0.0.1:8080"),
server.WithMaxRequestBodySize(20<<20),
server.WithTransport(standard.NewTransporter),
server.WithListenConfig(&net.ListenConfig{
Control: func(network, address string, c syscall.RawConn) error {
return c.Control(func(fd uintptr) {
syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, unix.SO_REUSEPORT, 1)
})
},
}),
)
h.GET("/hello", func(ctx context.Context, c *app.RequestContext) {
c.String(consts.StatusOK, "Hello hertz!")
})
h.Spin()
}
本文作者:七つ一旋桜
本文链接:https://www.cnblogs.com/poifa/p/17831343.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步