1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- package main
- import (
- "context"
- "bytes"
- "log"
- "net"
- "os"
- "os/exec"
- "runtime"
- "syscall"
- "github.com/cloudwego/hertz/pkg/app"
- "github.com/cloudwego/hertz/pkg/app/server"
- cxcputhread "github.com/cloudxaas/gocpu/thread"
- cxstrconv "github.com/cloudxaas/gostrconv"
- "github.com/panjf2000/ants/v2"
- "golang.org/x/sys/unix"
- )
- 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)
- }
- h := server.New(
- server.WithHostPorts("0.0.0.0:8080"),
- ///*
- 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("/plaintext", func(ctx context.Context, c *app.RequestContext) {
- c.String(consts.StatusOK, "get")
- })
- */
- ///*
- h.Use(func(cc context.Context, ctx *app.RequestContext) {
- HertzHandler(&cc, ctx)
- })
- //*/
- h.Spin()
- }
- func HertzHandler(cc *context.Context, ctx *app.RequestContext) {
- if bytes.EqualFold(ctx.Request.URI().RequestURI(), []byte("/plaintext")) {
- ctx.Response.Header.SetStatusCode(200)
- ctx.Response.Header.SetContentType("text/plain")
- ctx.Response.SetBodyRaw([]byte("Hello World!"))
- }
- if bytes.EqualFold(ctx.Request.URI().RequestURI(), []byte("/json")) {
- ctx.Response.Header.SetStatusCode(200)
- ctx.Response.Header.SetContentType("text/json")
- ctx.Response.SetBodyRaw([]byte("{\"Hello World!\"}"))
- }
- }
|