github.com/nutsdb/nutsdb@v1.0.4/examples/batch/concurrence/main.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "log" 7 "os" 8 "time" 9 10 "github.com/nutsdb/nutsdb" 11 "github.com/xujiajun/utils/strconv2" 12 ) 13 14 func readWorker(id int, jobs <-chan int, results chan<- struct{}) { 15 for j := range jobs { 16 fmt.Println("readWorker", id, "started job", j) 17 time.Sleep(time.Second) 18 19 key := strconv2.IntToStr(j) 20 if err := db.View( 21 func(tx *nutsdb.Tx) error { 22 value, err := tx.Get(bucket, []byte(key)) 23 if err != nil { 24 return err 25 } 26 fmt.Println("val:", string(value)) 27 28 return nil 29 }); err != nil { 30 log.Println(err) 31 } 32 33 fmt.Println("readWorker", id, "finished job", j) 34 results <- struct{}{} 35 } 36 } 37 38 func writeWorker(id int, jobs <-chan int, results chan<- struct{}) { 39 for j := range jobs { 40 fmt.Println("writeWorker", id, "started job", j) 41 time.Sleep(time.Second) 42 43 key := strconv2.IntToStr(j) 44 if err := db.Update( 45 func(tx *nutsdb.Tx) error { 46 val := []byte("val" + key) 47 return tx.Put(bucket, []byte(key), val, 0) 48 }); err != nil { 49 log.Fatal(err) 50 } 51 52 fmt.Println("writeWorker", id, "finished job", j) 53 results <- struct{}{} 54 } 55 } 56 57 var ( 58 db *nutsdb.DB 59 err error 60 bucket string 61 ) 62 63 func removeFileDir(fileDir string) { 64 files, _ := ioutil.ReadDir(fileDir) 65 for _, f := range files { 66 name := f.Name() 67 if name != "" { 68 fmt.Println(fileDir + "/" + name) 69 err := os.Remove(fileDir + "/" + name) 70 if err != nil { 71 panic(err) 72 } 73 } 74 } 75 } 76 77 func main() { 78 removeFlag := false 79 fileDir := "/tmp/nutsdb_example_concurrence" 80 81 if removeFlag { 82 removeFileDir(fileDir) 83 } 84 85 db, err = nutsdb.Open( 86 nutsdb.DefaultOptions, 87 nutsdb.WithDir(fileDir), 88 nutsdb.WithSegmentSize(1024*1024), // 1MB 89 ) 90 if err != nil { 91 panic(err) 92 } 93 94 bucket = "bucketForString" 95 // create bucket first 96 createBucket() 97 98 readJobs := make(chan int, 10) 99 writeJobs := make(chan int, 10) 100 readResults := make(chan struct{}, 10) 101 writeResults := make(chan struct{}, 10) 102 103 for w := 1; w <= 3; w++ { 104 go readWorker(w, readJobs, readResults) 105 } 106 107 for w := 1; w <= 3; w++ { 108 go writeWorker(w, writeJobs, writeResults) 109 } 110 111 for j := 1; j <= 10; j++ { 112 readJobs <- j 113 } 114 115 for j := 1; j <= 10; j++ { 116 writeJobs <- j 117 } 118 119 close(readJobs) 120 close(writeJobs) 121 122 for a := 1; a <= 10; a++ { 123 <-readResults 124 } 125 for a := 1; a <= 10; a++ { 126 <-writeResults 127 } 128 } 129 130 func createBucket() { 131 if err := db.Update( 132 func(tx *nutsdb.Tx) error { 133 return tx.NewBucket(nutsdb.DataStructureBTree, bucket) 134 }); err != nil { 135 //log.Fatal(err) 136 } 137 }