go-channel-goroutine实践2

niyuelin1990 · · 966 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

需求:获取数组数据,对数据的原始数据逐个进行处理,后返回处理完的数据

目标:对列表数据进行逐个goroutine并发处理,再用select整合,返回数据

type  money_per struct{
       id int
       name string
       money float64
}
type MoneyHandler interface {
       BatchDeal(m money_per)
}
type MoneyHandlerImpl struct {
}

func getMoneyHandler() MoneyHandler  {
       return &MoneyHandlerImpl{}
}

var moneyPers = make([]money_per, 10)
var mchan = make(chan money_per, 100)

//初始化
func init()  {
       for  i :=0; i<10 ;i++  {
              var moneyPer = money_per{i, "ww"+strconv.Itoa(i), float64(i)}
              moneyPers[i] = moneyPer
       }
}

//业务处理
func (monnryHandler MoneyHandlerImpl)BatchDeal(m money_per) {
       m.money +=11.0
       time.Sleep(time.Second)
       mchan <- m
}

func main() {
       fmt.Println(moneyPers, cap(moneyPers), len(moneyPers))
       t1 := time.Now()
       moneyHandler := getMoneyHandler()
       for mm := range moneyPers{
              fmt.Println(moneyPers[mm])
              go moneyHandler.BatchDeal(moneyPers[mm])
       }
       elapsed0 := time.Since(t1)
       fmt.Println("App elapsed0: ", elapsed0)
       rm := make([]money_per,10)
       for  i :=0; i<10 ;i++  {
              //m := <-mchan
              //rm[m.id] = m
              //fmt.Println(m)
              select { // select轮询机制
              case m := <- mchan:
                     fmt.Println(m)
                     rm[m.id] = m
              }
       }
       elapsed := time.Since(t1)
       fmt.Println("App elapsed: ", elapsed)
}


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

本文来自:CSDN博客

感谢作者:niyuelin1990

查看原文:go-channel-goroutine实践2

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

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