Browse Source

do preforking only if -prefork flag passed

default mode is classic one-process.
preforking for special benchmarking mode go-prefork
Sokolov Yura aka funny_falcon 10 years ago
parent
commit
2026a88c73
1 changed files with 52 additions and 31 deletions
  1. 52 31
      frameworks/Go/go/src/hello/hello.go

+ 52 - 31
frameworks/Go/go/src/hello/hello.go

@@ -56,13 +56,53 @@ var (
 	helloWorldBytes = []byte(helloWorldString)
 )
 
+var prefork = flag.Bool("prefork", false, "use prefork")
+var child = flag.Bool("child", false, "is child proc")
+
 func main() {
+	var listener net.Listener
+	flag.Parse()
+	if !*prefork {
+		runtime.GOMAXPROCS(runtime.NumCPU())
+	} else {
+		listener = doPrefork()
+	}
+
+	db, err := sql.Open("mysql", connectionString)
+	if err != nil {
+		log.Fatalf("Error opening database: %v", err)
+	}
+	db.SetMaxIdleConns(maxConnectionCount)
+	worldStatement, err = db.Prepare(worldSelect)
+	if err != nil {
+		log.Fatal(err)
+	}
+	fortuneStatement, err = db.Prepare(fortuneSelect)
+	if err != nil {
+		log.Fatal(err)
+	}
+	updateStatement, err = db.Prepare(worldUpdate)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	http.HandleFunc("/db", dbHandler)
+	http.HandleFunc("/queries", queriesHandler)
+	http.HandleFunc("/json", jsonHandler)
+	http.HandleFunc("/fortune", fortuneHandler)
+	http.HandleFunc("/update", updateHandler)
+	http.HandleFunc("/plaintext", plaintextHandler)
+	if !*prefork {
+		http.ListenAndServe(":8080", nil)
+	} else {
+		http.Serve(listener, nil)
+	}
+}
+
+func doPrefork() (listener net.Listener) {
 	var err error
 	var fl *os.File
 	var tcplistener *net.TCPListener
-	var listener net.Listener
-	var child = flag.Bool("child", false, "is child proc")
-	flag.Parse()
 	if !*child {
 		var addr *net.TCPAddr
 		addr, err = net.ResolveTCPAddr("tcp", ":8080")
@@ -79,7 +119,7 @@ func main() {
 		}
 		children := make([]*exec.Cmd, runtime.NumCPU()/2)
 		for i := range children {
-			children[i] = exec.Command(os.Args[0], "-child")
+			children[i] = exec.Command(os.Args[0], "-prefork", "-child")
 			children[i].Stdout = os.Stdout
 			children[i].Stderr = os.Stderr
 			children[i].ExtraFiles = []*os.File{fl}
@@ -89,40 +129,21 @@ func main() {
 			}
 		}
 		for _, ch := range children {
-			ch.Wait()
+			var err error = ch.Wait()
+			if err != nil {
+				log.Print(err)
+			}
 		}
 		os.Exit(0)
 	} else {
 		fl = os.NewFile(3, "")
 		listener, err = net.FileListener(fl)
+		if err != nil {
+			log.Fatal(err)
+		}
 		runtime.GOMAXPROCS(2)
 	}
-
-	db, err := sql.Open("mysql", connectionString)
-	if err != nil {
-		log.Fatalf("Error opening database: %v", err)
-	}
-	db.SetMaxIdleConns(maxConnectionCount)
-	worldStatement, err = db.Prepare(worldSelect)
-	if err != nil {
-		log.Fatal(err)
-	}
-	fortuneStatement, err = db.Prepare(fortuneSelect)
-	if err != nil {
-		log.Fatal(err)
-	}
-	updateStatement, err = db.Prepare(worldUpdate)
-	if err != nil {
-		log.Fatal(err)
-	}
-
-	http.HandleFunc("/db", dbHandler)
-	http.HandleFunc("/queries", queriesHandler)
-	http.HandleFunc("/json", jsonHandler)
-	http.HandleFunc("/fortune", fortuneHandler)
-	http.HandleFunc("/update", updateHandler)
-	http.HandleFunc("/plaintext", plaintextHandler)
-	http.Serve(listener, nil)
+	return listener
 }
 
 // Test 1: JSON serialization