main.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package main
  2. import (
  3. "flag"
  4. "log"
  5. "net"
  6. "net/http"
  7. "runtime"
  8. "go-std/src/handlers"
  9. "go-std/src/storage"
  10. "go-std/src/templates"
  11. )
  12. func initSyncPools() {
  13. handlers.InitMessagePool()
  14. storage.InitWorldPool()
  15. storage.InitWorldsPool()
  16. templates.InitFortunesPool()
  17. }
  18. func main() {
  19. initSyncPools()
  20. // init flags
  21. bindHost := flag.String("bind", ":8080", "set bind host")
  22. prefork := flag.Bool("prefork", false, "use prefork")
  23. easyjson := flag.Bool("easyjson", false, "use easyjson")
  24. child := flag.Bool("child", false, "is child proc")
  25. dbDriver := flag.String("db", "none", "db connection driver [values: pq || pgx || mysql || mgo || none]")
  26. dbConnectionString := flag.String("db_connection_string",
  27. "host=tfb-database user=benchmarkdbuser password=benchmarkdbpass dbname=hello_world sslmode=disable",
  28. "db connection string")
  29. flag.Parse()
  30. // check for prefork
  31. var listener net.Listener
  32. if *prefork {
  33. listener = doPrefork(*child, *bindHost)
  34. } else {
  35. runtime.GOMAXPROCS(runtime.NumCPU())
  36. }
  37. // init database with appropriate driver
  38. db, err := storage.InitDB(*dbDriver, *dbConnectionString, runtime.NumCPU()*4)
  39. if err != nil {
  40. log.Fatal(err)
  41. }
  42. if *child {
  43. db, err = storage.InitDB(*dbDriver, *dbConnectionString, runtime.NumCPU())
  44. if err != nil {
  45. log.Fatal(err)
  46. }
  47. }
  48. // init handlers
  49. http.HandleFunc("/plaintext", handlers.PlaintextHandler)
  50. if *easyjson {
  51. http.HandleFunc("/json", handlers.JSONHandlerEasyJSON)
  52. } else {
  53. http.HandleFunc("/json", handlers.JSONHandler)
  54. }
  55. if db != nil {
  56. defer db.Close()
  57. // http.HandleFunc("/fortune", handlers.FortuneHandler(db))
  58. http.HandleFunc("/fortunes", handlers.FortuneHandlerPool(db))
  59. // http.HandleFunc("/fortune-quick", handlers.FortuneQuickHandler(db))
  60. http.HandleFunc("/fortune-quick", handlers.FortuneQuickHandlerPool(db))
  61. if *easyjson {
  62. http.HandleFunc("/db", handlers.DBHandlerEasyJSON(db))
  63. http.HandleFunc("/queries", handlers.QueriesHandlerEasyJSON(db))
  64. http.HandleFunc("/update", handlers.UpdateHandlerEasyJSON(db))
  65. } else {
  66. http.HandleFunc("/db", handlers.DBHandler(db))
  67. http.HandleFunc("/queries", handlers.QueriesHandler(db))
  68. http.HandleFunc("/update", handlers.UpdateHandler(db))
  69. }
  70. }
  71. // start server
  72. if *prefork {
  73. http.Serve(listener, nil)
  74. } else {
  75. http.ListenAndServe(*bindHost, nil)
  76. }
  77. }