go之channel任意任务完成、全部任务完成退出

简介: go之channel任意任务完成、全部任务完成退出

一、任意任务完成

import (
  "fmt"
  "runtime"
  "testing"
  "time"
)
 
func runTask(id int) string {
  time.Sleep(time.Millisecond * 10)
  return fmt.Sprintf("The result is from %d", id)
}
 
//任意任务完成
func FirstReponse() string {
  numOfRunner := 10
  //buffer chan防止协程泄露
  ch := make(chan string, numOfRunner)
  for i := 0; i < numOfRunner; i++ {
    go func(i int) {
      ret := runTask(i)
      ch <- ret
    }(i)
  }
  //任意任务完成
  return <-ch
}

二、全部任务完成

import (
  "fmt"
  "runtime"
  "testing"
  "time"
)
 
func runTask(id int) string {
  time.Sleep(time.Millisecond * 10)
  return fmt.Sprintf("The result is from %d", id)
}
 
//全部任务完成后返回
func AllReponse() string {
  numOfRunner := 10
  //buffer chan防止协程泄露
  ch := make(chan string, numOfRunner)
  for i := 0; i < numOfRunner; i++ {
    go func(i int) {
      ret := runTask(i)
      ch <- ret
    }(i)
  }
  finalRet := ""
  for n := 0; n < numOfRunner; n++ {
    finalRet += <-ch + "\n"
  }
  return finalRet
}

三、测试

import (
  "fmt"
  "runtime"
  "testing"
  "time"
)
 
func runTask(id int) string {
  time.Sleep(time.Millisecond * 10)
  return fmt.Sprintf("The result is from %d", id)
}
 
//任意任务完成
func FirstReponse() string {
  numOfRunner := 10
  //buffer chan防止协程泄露
  ch := make(chan string, numOfRunner)
  for i := 0; i < numOfRunner; i++ {
    go func(i int) {
      ret := runTask(i)
      ch <- ret
    }(i)
  }
  //任意任务完成
  return <-ch
}
 
//全部任务完成后返回
func AllReponse() string {
  numOfRunner := 10
  //buffer chan防止协程泄露
  ch := make(chan string, numOfRunner)
  for i := 0; i < numOfRunner; i++ {
    go func(i int) {
      ret := runTask(i)
      ch <- ret
    }(i)
  }
  finalRet := ""
  for n := 0; n < numOfRunner; n++ {
    finalRet += <-ch + "\n"
  }
  return finalRet
}
func TestFirstResponse(t *testing.T) {
  t.Log("Before:", runtime.NumGoroutine())
  //t.Log(FirstReponse())
  t.Log(AllReponse())
  time.Sleep(time.Second * 1)
  t.Log("After:", runtime.NumGoroutine())
}
任意任务完成
=== RUN   TestFirstResponse
    first_response_test.go:48: Before: 2
    first_response_test.go:49: The result is from 0
    first_response_test.go:52: After: 2
--- PASS: TestFirstResponse (1.03s)
PASS
 
全部任务完成
=== RUN   TestFirstResponse
    first_response_test.go:48: Before: 2
    first_response_test.go:50: The result is from 4
        The result is from 6
        The result is from 9
        The result is from 5
        The result is from 1
        The result is from 7
        The result is from 8
        The result is from 3
        The result is from 0
        The result is from 2
        
    first_response_test.go:52: After: 2
--- PASS: TestFirstResponse (1.03s)
PASS
相关文章
|
5月前
|
Go 开发者
Go语言实战案例:使用select监听多个channel
本文为《Go语言100个实战案例 · 网络与并发篇》第5篇,详解Go并发核心工具`select`的使用。通过实际案例讲解如何监听多个Channel、实现多任务处理、超时控制和非阻塞通信,帮助开发者掌握Go并发编程中的多路异步事件处理技巧。
|
5月前
|
数据采集 编解码 监控
Go语言实战案例:使用channel实现生产者消费者模型
本文是「Go语言100个实战案例 · 网络与并发篇」第4篇,通过实战案例详解使用 Channel 实现生产者-消费者模型,涵盖并发控制、任务调度及Go语言并发哲学,助你掌握优雅的并发编程技巧。
|
存储 Go 开发者
Go语言中的并发编程与通道(Channel)的深度探索
本文旨在深入探讨Go语言中并发编程的核心概念和实践,特别是通道(Channel)的使用。通过分析Goroutines和Channels的基本工作原理,我们将了解如何在Go语言中高效地实现并行任务处理。本文不仅介绍了基础语法和用法,还深入讨论了高级特性如缓冲通道、选择性接收以及超时控制等,旨在为读者提供一个全面的并发编程视角。
304 50
go之channel关闭与广播
go之channel关闭与广播
192 0
|
安全 Go 数据处理
Go语言中的并发编程:掌握goroutine和channel的艺术####
本文深入探讨了Go语言在并发编程领域的核心概念——goroutine与channel。不同于传统的单线程执行模式,Go通过轻量级的goroutine实现了高效的并发处理,而channel作为goroutines之间通信的桥梁,确保了数据传递的安全性与高效性。文章首先简述了goroutine的基本特性及其创建方法,随后详细解析了channel的类型、操作以及它们如何协同工作以构建健壮的并发应用。此外,还介绍了select语句在多路复用中的应用,以及如何利用WaitGroup等待一组goroutine完成。最后,通过一个实际案例展示了如何在Go中设计并实现一个简单的并发程序,旨在帮助读者理解并掌
|
安全 Go 调度
探索Go语言的并发模型:goroutine与channel
在这个快节奏的技术世界中,Go语言以其简洁的并发模型脱颖而出。本文将带你深入了解Go语言的goroutine和channel,这两个核心特性如何协同工作,以实现高效、简洁的并发编程。
|
Go 调度 开发者
探索Go语言中的并发模式:goroutine与channel
在本文中,我们将深入探讨Go语言中的核心并发特性——goroutine和channel。不同于传统的并发模型,Go语言的并发机制以其简洁性和高效性著称。本文将通过实际代码示例,展示如何利用goroutine实现轻量级的并发执行,以及如何通过channel安全地在goroutine之间传递数据。摘要部分将概述这些概念,并提示读者本文将提供哪些具体的技术洞见。
|
安全 Go 调度
探索Go语言的并发之美:goroutine与channel
在这个快节奏的技术时代,Go语言以其简洁的语法和强大的并发能力脱颖而出。本文将带你深入Go语言的并发机制,探索goroutine的轻量级特性和channel的同步通信能力,让你在高并发场景下也能游刃有余。
|
存储 安全 Go
探索Go语言的并发模型:Goroutine与Channel
在Go语言的多核处理器时代,传统并发模型已无法满足高效、低延迟的需求。本文深入探讨Go语言的并发处理机制,包括Goroutine的轻量级线程模型和Channel的通信机制,揭示它们如何共同构建出高效、简洁的并发程序。

热门文章

最新文章