1.协程最佳实践,多个协程并发求素数

点击查看代码
var wg sync.WaitGroup

func Prime(num int) bool {
if num == 1 {
return false
}
for i := 2; i*i <= num; i++ {
if num%i == 0 {
return false
}
}
return true
} func test1(ch chan int) {
for i := 1; i <= 100; i++ {
ch <- i
}
close(ch)
defer wg.Done()
} func test2(ch chan int, ch2 chan int, exitChan chan bool) {
for v := range ch {
if Prime(v) {
ch2 <- v
}
}
exitChan <- true
defer wg.Done()
} func test3(ch2 chan int, exitChan chan bool) {
for v := range ch2 {
fmt.Println(v)
}
exitChan <- true
defer wg.Done()
} func main() {
var ch = make(chan int, 20)
var ch2 = make(chan int, 20)
var exitChan = make(chan bool, 5)
//for i := 0; i < 5; i++ {
wg.Add(1)
go test1(ch)
//}
for i := 0; i < 5; i++ {
wg.Add(1)
go test2(ch, ch2, exitChan)
}
//for i := 0; i < 5; i++ {
wg.Add(1)
go test3(ch2, exitChan)
//}
wg.Add(1)
go func() {
for i := 0; i < 5; i++ {
<-exitChan
}
close(ch2)
}()
wg.Done() wg.Wait()
}

ch管道用于存放1~100的数字,放完后关闭,ch2管道用于统计素数,test3()函数用于从ch2管道取出数据并打印

2.Context包的基本使用

使用context包目的是管理协程的生命周期,以及管理多级协程,以下为Context()基本函数的使用

点击查看代码
func test(msg chan int, ctx context.Context) {
t := time.Tick(time.Second)
for range t {
select {
case n := <-msg:
fmt.Println("job", n, "done")
case <-ctx.Done():
fmt.Println("return...", ctx.Value(k))
return
}
}
} type str string var k str = "name"
var v str = "YueSe" func main() {
// ctx, clear := context.WithCancel(context.Background())
ctx := context.WithValue(context.Background(), k, v)
ctx, clear := context.WithDeadline(ctx, time.Now().Add(time.Second*5))
var message = make(chan int)
// var flag = make(chan bool)
go test(message, ctx)
for i := 0; i < 10; i++ {
message <- i
}
clear()
// flag <- true
time.Sleep(time.Second)
fmt.Println("all done") }

Done

golang协程的最佳实践与context包的基本使用的更多相关文章

  1. 面试必问:Golang高阶-Golang协程实现原理

    引言 实现并发编程有进程,线程,IO多路复用的方式.(并发和并行我们这里不区分,如果CPU是多核的,可能在多个核同时进行,我们叫并行,如果是单核,需要排队切换,我们叫并发) 进程和线程的区别 进程是计 ...

  2. Golang协程实现流量统计系统(3)

    进程.线程.协程 - 进程:太重 - 线程:上下文切换开销太大 - 协程:轻量级的线程,简洁的并发模式 Golang协程:goroutine Hello world package main impo ...

  3. golang协程同步的几种方法

    目录 golang协程同步的几种方法 协程概念简要理解 为什么要做同步 协程的几种同步方法 Mutex channel WaitGroup golang协程同步的几种方法 本文简要介绍下go中协程的几 ...

  4. Python与Golang协程异同

    背景知识 这里先给出一些常用的知识点简要说明,以便理解后面的文章内容. 进程的定义: 进程,是计算机中已运行程序的实体.程序本身只是指令.数据及其组织形式的描述,进程才是程序的真正运行实例. 线程的定 ...

  5. Golang协程实现流量统计系统(1)

    # 学习内容: # 学习目标: 学习Golang的基础开发 常用的Golang编程技艺 精巧省力的Go Lib 协程的真实应用实践 与其他语言对比着学 协程并发模型的深度应用 Growth hacki ...

  6. golang协程池设计

    Why Pool go自从出生就身带“高并发”的标签,其并发编程就是由groutine实现的,因其消耗资源低,性能高效,开发成本低的特性而被广泛应用到各种场景,例如服务端开发中使用的HTTP服务,在g ...

  7. Golang 协程调度

    一.线程模型 N:1模型,N个用户空间线程在1个内核空间线程上运行.优势是上下文切换非常快但是无法利用多核系统的优点. 1:1模型,1个内核空间线程运行一个用户空间线程.这种充分利用了多核系统的优势但 ...

  8. golang 协程嵌套,会产生依赖关系(父子关系)么?

    编码时冒出一个问题:在一个协程内部,再创建一个或多个协程,是否会产生依赖关系? 做了一个小实验,这里随笔记录一下经过,备注后续深入研究. test代码: package main import ( & ...

  9. Golang协程与通道整理

    协程goroutine        不由OS调度,而是用户层自行释放CPU,从而在执行体之间切换.Go在底层进行协助实现      涉及系统调用的地方由Go标准库协助释放CPU      总之,不通 ...

  10. 关于协程:nodejs和golang协程的不同

    nodejs和golang都是支持协程的,从表现上来看,nodejs对于协程的支持在于async/await,golang对协程的支持在于goroutine.关于协程的话题,简单来说,可以看作是非抢占 ...

随机推荐

  1. Notepad++ 搭建简单Java编译运行环境

    简介 有时候使用Eclips进行Java相关方法的测试和验证太繁琐,经过查询实践,使用了Notepad++和JDK搭建了一个简单的编译运行环境. 搭建过程 在电脑上安装Java环境(网上教程很多,此过 ...

  2. Linux 鉴定故障

    导读 进入linux,输入root账户,密码输入是正确的,提示"鉴定故障",刚开始以为是系统挂了,后来百度说,需要重置root密码,具体步骤如下. 重置root密码 重启Linux ...

  3. 探究kubernetes 探针参数periodSeconds和timeoutSeconds

    探究kubernetes 探针参数 periodSeconds和timeoutSeconds 问题起源 kubernetes probes的配置中有两个容易混淆的参数,periodSeconds和ti ...

  4. Java-EL表达式替换和简化jsp页面中java代码的编写

    概念:Expression Language 表达式语言 作用:替换和简化jsp页面中java代码的编写 语法:$ 注意: jsp默认支持el表达式,如果要忽略el表达式 设置jsp中page指令中: ...

  5. redis基本数据结构-集合set

    redis基本数据结构-集合set 特性 一个集合键最多存储 2^32 - 1 个字符串值 元素在集合内无序(哈希表-链地址法解决冲突) 元素在集合内唯一 向集合添加元素 sadd key value ...

  6. 容器技术Docker知识精讲【形成知识体系篇】

    作者的经验分享,包括很多实战过程和总结,为着手系统化学习Docker容器的朋友提供. 环境要求 Linux操作系统(Centos),建议在虚拟机VMware或VirtualBox下安装Centos D ...

  7. [rCore学习笔记 013]GDB跟踪程序

    题目要求 请学习 gdb 调试工具的使用(这对后续调试很重要),并通过 gdb 简单跟踪从机器加电到跳转到 0x80200000 的简单过程.只需要描述重要的跳转即可,只需要描述在 qemu 上的情况 ...

  8. .NET 轻量级 命令行工具 CSharpRepl

    前言 当我们需要快速测试代码片段时,常见的做法是启动Visual Studio或使用在线代码编辑器.然而,Visual Studio的启动可能较为缓慢且占用较多系统资源,而在线编辑器则可能遇到语法支持 ...

  9. docker 容器卷

    创建各种卷 [root@docker ~]# docker volume create mqy-vo101 mqy-vo101 [root@docker ~]# docker inspect mqy- ...

  10. 对比python学julia(第四章:人工智能)--(第三节)目标检测

    1.1.  项目简介 目标检测(Object Detection)的任务是在图像中找出检测对象的位置和犬小,是计算机视觉领域的核心问题之一,在自动驾驶.机器人和无人机等许多领域极具研究价值. 随着深度 ...