Go: channel

 

channel不能使用for循环动态遍历

package main

import (
    "fmt"
)

func main() {
    intChan := make(chan int, 10)
    for b := 0; b < cap(intChan); b++ {
        intChan <- b + 100
    }
    fmt.Println("len(intChan) =", len(intChan))
    for i := 0; i < len(intChan); i++ {
        fmt.Printf("before fetch i = %v, len(intChan) = %v\n", i, len(intChan))
        println(<-intChan)
        fmt.Printf("after fetch i = %v, len(intChan) = %v\n", i, len(intChan))
        fmt.Println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
    }
}

 

 

package main

import (
  "bytes"
  "fmt"
  "runtime"
  "strconv"
  "time"
)

func GetGoroutineId() (n uint64) {
  vail := make([]byte, 1024)
  vail = vail[:runtime.Stack(vail, true)]
  // fmt.Println(string(vail))
  vail = bytes.TrimPrefix(vail, []byte("goroutine "))
  vail = vail[:bytes.IndexByte(vail, ' ')]
  n, err := strconv.ParseUint(string(vail), 10, 64)
  if err != nil {
    return 0
  }
  return
}
func generate(c chan int, n int) {
  for i := 1; i <= n; i++ {
    c <- i
  }
  close(c)
}
func worker(intChan chan int, exitChan chan bool, primeChan chan int) {
  var flag bool
  for {
    number, ok := <-intChan
    if !ok {
      break
    }
    flag = true
    for i := 2; i < number; i++ {
      if number%i == 0 {
        flag = false
        break
      }
    }
    if flag {
      primeChan <- number
    }
  }
  fmt.Printf("Goroutine(%v) exit intChan empty\n", strconv.Itoa(int(GetGoroutineId())))
  exitChan <- true
}
func main() {
  intChan := make(chan int, 1000)
  primeChan := make(chan int, 20000)
  exitChan := make(chan bool, 4)

  var (
    numbers      int = 222222222
    workerNumber int = 1
    primeCount   int
    commence     = time.Now().Unix()
    closure      int64
  )

  go generate(intChan, numbers)
  for i := 0; i < workerNumber; i++ {
    go worker(intChan, exitChan, primeChan)
  }
  go func() {
    for i := 0; i < workerNumber; i++ {
      <-exitChan
    }
    fmt.Printf("Goroutine(%v) all worker goroutine exit\n", strconv.FormatUint(GetGoroutineId(), 10))

    closure = time.Now().Unix()

    close(primeChan)
    close(exitChan)
  }()

  // println(len(primeChan))
  for {
    _, ok := <-primeChan
    if !ok {
      break
    }
    // fmt.Printf("prime: %v\n", prime)
    primeCount++
  }

  elapsed := closure - commence
  fmt.Println("elapsed:", elapsed)
  println(primeCount)
  fmt.Printf("Goroutine(%v) main exixt", strconv.FormatUint(GetGoroutineId(), 10))
}

 

posted @ 2022-05-19 22:48  ascertain  阅读(19)  评论(0编辑  收藏  举报