测试和学goroutine, 遇到的问题

lccc · 2018-12-24 14:04:46 · 1105 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2018-12-24 14:04:46 的主题,其中的信息可能已经有所发展或是发生改变。

想从一个字符切片[]string中打印切片中的每个元素, 且每个打印动作都用一个goroutine完成, 限制goroutine最大数量 为5。 以下是我写的代码, 但不能打印完整, 5个goroutine用完后不会打切片后面的字符了,怎么让goroutine循环使用, 将其切片中所有的字符 打印完? 哪位高手来指点一下。


package main

import (
        "fmt"
        "time"
)

type Worker struct {
        Workcount int
}

func (w *Worker) Run(ch chan string,  strs []string) {
        for i := 0; i < w.Workcount; i++ {
                var s string
                if len(strs) > 0 {
                        s = strs[0]
                        strs = strs[1:]
                }
                createWorker(ch,  s, i)
        }
}

func createWorker(ch chan string, s string, goid int) {

        go func(id int) {
                worker(id,ch, s)
        }(goid)

}

func worker(id int,ch chan string,  str string) {
                ch <- str
        fmt.Printf("goid is %d , string is %s\n", id, str)
}

func main() {
        input := []string{"goland", "time", "slice", "reflect", "strings", "regexp", "map", "convert", "google", "complier"}
        e := Worker{Workcount: 5}
        ch := make(chan string)
        e.Run(ch,  input)
        t := time.After(5 * time.Second)
        for {
                select {
                case re := <-ch:
                        fmt.Println(re)
                case <-t:
                        fmt.Println("timeout")
                        return
                }
        }
}

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1105 次点击  
加入收藏 微博
5 回复  |  直到 2018-12-29 15:18:36
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传