批里批里 (゜-゜)つ🍺 干杯|

七つ一旋桜

园龄:4年2个月粉丝:6关注:3

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 中国大陆许可协议进行许可。

posted @   七つ一旋桜  阅读(74)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起