Advertisement
Guest User

Untitled

a guest
Aug 25th, 2016
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.01 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "database/sql"
  5. "flag"
  6. "fmt"
  7. "log"
  8. "math/rand"
  9. "os"
  10. "os/signal"
  11. "sync"
  12. "sync/atomic"
  13. "syscall"
  14. "time"
  15.  
  16. _ "github.com/go-sql-driver/mysql"
  17. "github.com/twinj/uuid"
  18. )
  19.  
  20. func main() {
  21. port := flag.String("p", "4000", "port")
  22. count := flag.Int("c", 1, "number goroutine")
  23. flag.Parse()
  24. log.Println("start")
  25. var n int64
  26. lastTime := time.Now()
  27. var done int32
  28. wg := sync.WaitGroup{}
  29. wg.Add(*count)
  30. db, err := sql.Open("mysql", fmt.Sprintf("root@tcp(localhost:%s)/test", *port))
  31. if err != nil {
  32. log.Fatal(err)
  33. }
  34. defer db.Close()
  35.  
  36. _, err = db.Exec(`create table if not exists tbl (
  37. id VARCHAR(1000) NOT NULL,
  38. filed1 BIGINT(20),
  39. filed2 VARCHAR(1000),
  40. filed INT(10) DEFAULT NULL,
  41. filed3 VARCHAR(1000),
  42. filed4 BIGINT(20),
  43. filed5 VARCHAR(100),
  44. PRIMARY KEY (id))`)
  45.  
  46. if err != nil {
  47. log.Fatal(err)
  48. }
  49.  
  50. for i := 0; i < *count; i++ {
  51. go func() {
  52. for atomic.LoadInt32(&done) == 0 {
  53. u := uuid.NewV4().Bytes()
  54. _, err = db.Exec("insert into tbl (id, filed1, filed2, filed3, filed4, filed5) values (?, ?, ?, ?, ?, ?)",
  55. u, rand.Int(), u, u, rand.Int63(), u)
  56. if err != nil {
  57. log.Println(err)
  58. continue
  59. }
  60. current := atomic.AddInt64(&n, 1)
  61. if current%10000 == 0 {
  62. now := time.Now()
  63. useTime := now.Sub(lastTime)
  64. lastTime = now
  65. log.Printf("total: %v speed: %.2f", current, 10000.0/useTime.Seconds())
  66. }
  67. }
  68. wg.Done()
  69. }()
  70. }
  71. sigchan := make(chan os.Signal, 1)
  72. signal.Notify(sigchan, os.Interrupt)
  73. signal.Notify(sigchan, syscall.SIGTERM)
  74. sig := <-sigchan
  75. atomic.AddInt32(&done, 1)
  76. log.Printf("receive signal %v and close\n", sig)
  77. wg.Wait()
  78. log.Println("total", n)
  79. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement