初级会员
  • 第 15664 位会员
  • lccc
  • 2018-01-22 21:48:12
  • Offline
  • 20 60

最近发布的文章

    暂无

最近分享的资源

    暂无

最近发布的项目

    暂无

最近的评论

  • lxc5089@163.com 谢谢
  • 最后的值能理解, 但i怎么是2呢, i<2后, i++还会计算下去吗?
  • #3 @mortemnh 请教下这位同学, 我要怎么改才可以不用time.After也可行, 一个协程不是一发一收就不会阻塞吗, 我是在哪个地方阻塞了。
  • 改成以下代码后, 可以实现, 但有一个奇怪的问题是select中注释掉time.After和<-t 后就会死锁了, 是什么原因呢? ```go package main import ( "fmt" //"time" ) type Worker struct { Workcount int requestchan chan string workchan chan string } func (w *Worker) Run(strs []string) { for _, v := range strs { go func(s string) { w.requestchan <- s }(v) } for i := 0; i < w.Workcount; i++ { w.worker(i) } //t := time.After(15 * time.Second) for { select { case re := <-w.requestchan: w.submit(re) case work := <-w.workchan: fmt.Println(work) //case <-t: // fmt.Println("---timeout--") // return } } } func (w *Worker) worker(goid int) { go func(id int) { fmt.Printf("goid is %d\n", id) }(goid) } func (w *Worker) submit(s string) { go func() { w.workchan <- s }() } func main() { input := []string{"php", "java", "python", "javascript", "goland", "time", "slice", "reflect", "strings", "regexp", "map", "convert", "google", "complier"} e := Worker{Workcount: 5, requestchan: make(chan string), workchan: make(chan string)} e.Run(input) } ``` fatal error: all goroutines are asleep - deadlock! goroutine 1 [select]: main.(*Worker).Run(0xc00000a080, 0xc00003c6a8, 0xe, 0xe) /home/steven/go/src/mytest/mtest/ch.go:26 +0x18a main.main() /home/steven/go/src/mytest/mtest/ch.go:54 +0xf3 exit status 2
  • 谢谢