如何在http中使用多个进程

How to make use of all CPUs and spawn a http process for each CPU?

Get num of CPUs

numCPU := runtime.NumCPU()

Start http

package main

import (
    "fmt"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:])
}

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}

If your goal is just to have your request-processing code run on all CPU cores, net/http already starts a goroutine (a vaguely thread-like thing with a Go-specific implementation) per connection, and Go arranges for NumCPU OS threads to run by default so that goroutines can be spread across all available CPU cores.

The Accept loop runs in a single goroutine, but the actual work of parsing requests and generating responses runs in one per connection.

You can't nativly, you have to write your own wrapper:

// copied from http://golang.org/src/pkg/net/http/server.go#L1942
type tcpKeepAliveListener struct {
    *net.TCPListener
}

func (ln tcpKeepAliveListener) Accept() (c net.Conn, err error) {
    tc, err := ln.AcceptTCP()
    if err != nil {
        return
    }
    tc.SetKeepAlive(true)
    tc.SetKeepAlivePeriod(3 * time.Minute)
    return tc, nil
}

func ListenAndServe(addr string, num int) error {
    if addr == "" {
        addr = ":http"
    }
    ln, err := net.Listen("tcp", addr)
    if err != nil {
        return err
    }
    var wg sync.WaitGroup
    for i := 0; i < num; i++ {
        wg.Add(1)
        go func(i int) {
            log.Println("listener number", i)
            log.Println(http.Serve(tcpKeepAliveListener{ln.(*net.TCPListener)}, nil))

            wg.Done()
        }(i)
    }
    wg.Wait()
    return nil
}

func main() {
    num := runtime.NumCPU()
    runtime.GOMAXPROCS(num) //so the goroutine listeners would try to run on multiple threads
    log.Println(ListenAndServe(":9020", num))
}

Or if you use a recent enough Linux Kernel you can use the patch from http://comments.gmane.org/gmane.comp.lang.go.general/121122 and actually spawn multiple processes.