golang 无缓冲channel

golang 无缓冲channel

package main

import "fmt"

func main() {

    // 1S =1000ms
    //1ms = 1000us
    //1us =1000ns
    /*
    定义channel:make(chan 类型,容量)
    ch :=make(chan string)
    写端 ch <-"hello"
    读端 str := <-ch

     */

    ch :=make(chan string) //无缓冲channel
    fmt.Println("len(ch)=",len(ch),"cap(ch)=",cap(ch))

    go func() {
        for i:=0;i<2;i++{
            fmt.Println("i=",i)
        }
        ch <-"子go打印完毕"
    }()

    str := <-ch
    fmt.Println("str=",str)


}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,可以通过使用 channel 来控制并发 goroutine 的数量。具体的实现方法是,创建一个带缓冲channel,并在启动 goroutine 之前将一些数据发送到 channel 中。每当一个 goroutine 启动时,从 channel 中读取一个数据,如果 channel 已经空了,则 goroutine 会被阻塞,直到有新的数据进入 channel。 这个方法的原理是,通过限制 channel 中数据的数量,从而限制同时运行的 goroutine 数量。当 channel 已满时,新的 goroutine 会被阻塞,直到有其他 goroutine 执行完毕,从而腾出一个 channel 位置。 下面是一个示例代码,使用 channel 控制同时运行的 goroutine 数量: ```go package main import ( "fmt" "time" ) func worker(id int, jobs <-chan int, results chan<- int) { for j := range jobs { fmt.Println("worker", id, "started job", j) time.Sleep(time.Second) fmt.Println("worker", id, "finished job", j) results <- j * 2 } } func main() { const numJobs = 10 const numWorkers = 3 jobs := make(chan int, numJobs) results := make(chan int, numJobs) for w := 1; w <= numWorkers; w++ { go worker(w, jobs, results) } for j := 1; j <= numJobs; j++ { jobs <- j } close(jobs) for a := 1; a <= numJobs; a++ { <-results } } ``` 在这个示例代码中,我们创建了一个 `jobs` channel 和一个 `results` channel,并启动了三个 goroutine 来处理 `jobs` channel 中的任务。在 `main` 函数中,我们向 `jobs` channel 中发送了 10 个任务,并在最后等待所有任务完成。 可以看到,在启动 goroutine 时,我们使用了带缓冲的 `jobs` channel,来限制同时运行的 goroutine 数量。当 `jobs` channel 已满时,新的 goroutine 会被阻塞,直到有其他 goroutine 执行完毕,从而腾出一个 channel 位置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值