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  }