go语言中用select调度

本文探讨了使用Go语言实现的并发数据生成与处理机制,通过channel进行数据的传递和工作流的调度,实现了数据生成器与多个工作者之间的高效通信。文章详细介绍了如何创建并启动数据生成器和工作者,以及如何在主函数中协调它们的工作流程,同时展示了如何使用time.After和time.Tick来控制程序的运行节奏和监测队列长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package main

import (
   "fmt"
   "math/rand"
   "time"
)

func generator() chan int {
   out := make(chan int)
   go func() {
      i:=0
      for {
         time.Sleep(time.Duration(rand.Intn(1500))*time.Millisecond)
         out <- i
         i++
      }
   }()
   return out
}

func worker(id int, c chan int){
   for n:= range c{
      //n := <-c
      //fmt.Println(n)
      time.Sleep(time.Second)

      fmt.Printf("worker %d recived %d \n",id,n)
   }
}

func createWorker(id int) chan<- int{
   c := make(chan int)
   go worker(id,c)
   return c
}

func main() {
   var c1,c2 = generator(), generator()
   var worker = createWorker(0)
   var values []int
   tm := time.After(10*time.Second)
   tick := time.Tick(time.Second)
   for {
      var activeWorker chan<- int
      var activeValue int
      if len(values)>0{
         activeWorker = worker
         activeValue = values[0]
      }
      select {
         case n := <-c1:
            values = append(values,n)
         case n := <-c2:
            values = append(values,n)
         case activeWorker <- activeValue:
            values = values[1:]
         case <-time.After(800 * time.Millisecond):
            fmt.Println("timeout")
         case <-tick:
            fmt.Println("queue len= ",len(values))
         case <-tm:
            fmt.Println("bye")
            return
      }
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值