golang协程的最佳实践与context包的基本使用
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包的基本使用的更多相关文章
- 面试必问:Golang高阶-Golang协程实现原理
引言 实现并发编程有进程,线程,IO多路复用的方式.(并发和并行我们这里不区分,如果CPU是多核的,可能在多个核同时进行,我们叫并行,如果是单核,需要排队切换,我们叫并发) 进程和线程的区别 进程是计 ...
- Golang协程实现流量统计系统(3)
进程.线程.协程 - 进程:太重 - 线程:上下文切换开销太大 - 协程:轻量级的线程,简洁的并发模式 Golang协程:goroutine Hello world package main impo ...
- golang协程同步的几种方法
目录 golang协程同步的几种方法 协程概念简要理解 为什么要做同步 协程的几种同步方法 Mutex channel WaitGroup golang协程同步的几种方法 本文简要介绍下go中协程的几 ...
- Python与Golang协程异同
背景知识 这里先给出一些常用的知识点简要说明,以便理解后面的文章内容. 进程的定义: 进程,是计算机中已运行程序的实体.程序本身只是指令.数据及其组织形式的描述,进程才是程序的真正运行实例. 线程的定 ...
- Golang协程实现流量统计系统(1)
# 学习内容: # 学习目标: 学习Golang的基础开发 常用的Golang编程技艺 精巧省力的Go Lib 协程的真实应用实践 与其他语言对比着学 协程并发模型的深度应用 Growth hacki ...
- golang协程池设计
Why Pool go自从出生就身带“高并发”的标签,其并发编程就是由groutine实现的,因其消耗资源低,性能高效,开发成本低的特性而被广泛应用到各种场景,例如服务端开发中使用的HTTP服务,在g ...
- Golang 协程调度
一.线程模型 N:1模型,N个用户空间线程在1个内核空间线程上运行.优势是上下文切换非常快但是无法利用多核系统的优点. 1:1模型,1个内核空间线程运行一个用户空间线程.这种充分利用了多核系统的优势但 ...
- golang 协程嵌套,会产生依赖关系(父子关系)么?
编码时冒出一个问题:在一个协程内部,再创建一个或多个协程,是否会产生依赖关系? 做了一个小实验,这里随笔记录一下经过,备注后续深入研究. test代码: package main import ( & ...
- Golang协程与通道整理
协程goroutine 不由OS调度,而是用户层自行释放CPU,从而在执行体之间切换.Go在底层进行协助实现 涉及系统调用的地方由Go标准库协助释放CPU 总之,不通 ...
- 关于协程:nodejs和golang协程的不同
nodejs和golang都是支持协程的,从表现上来看,nodejs对于协程的支持在于async/await,golang对协程的支持在于goroutine.关于协程的话题,简单来说,可以看作是非抢占 ...
随机推荐
- python路径相关操作:os.path
Windows路径格式 import os # 当前python文件位置:T:\ProgrammingPractice\python_path\test.py # 给定的路径 path = r'D:\ ...
- 【创龙全国产T3核心板】赋能工业领域新发展
在工业5.0时代浪潮持续推进并具备确定性的时代背景下,工业领域创新升级的需求日益增长,为满足各种工业环境下的应用需求,面向工业领域,创龙科技推出了基于全志T3处理器的元器件全国产化工业级核心板--SO ...
- 全国产!全志T3+Logos FPGA核心板(4核ARM Cortex-A7)规格书
核心板简介 创龙科技SOM-TLT3F是一款基于全志科技T3四核ARM Cortex-A7处理器 + 紫光同创Logos PGL25G/PGL50G FPGA设计的异构多核全国产工业核心板,ARM C ...
- python rsa-oaep加密示例
代码: 1 from Crypto.PublicKey import RSA 2 from Crypto.Cipher import PKCS1_OAEP 3 import base64 4 rsa_ ...
- 记一次 .NET某酒业业务系统 崩溃分析
一:背景 1. 讲故事 前些天有位朋友找到我,说他的程序每次关闭时就会自动崩溃,一直找不到原因让我帮忙看一下怎么回事,这位朋友应该是第二次找我了,分析了下 dump 还是挺经典的,拿出来给大家分享一下 ...
- hbuilderx集成集中式版本控制系统SVN
前提条件: 1.下载最新的hbuilderx https://www.dcloud.io/hbuilderx.html 2.安装Tortorisesvn客户端,特别注意安装时一定要安装command ...
- Docker运维之容器的日志清理
在容器运行的过程中,通常会产生大量的日志,尤其是应用程序本身记录了info级别的日志时候,程序的标准输出记录到容器的日志.这样会占用大量的磁盘空间,严重者导致IO异常,最终服务会宕机. 方案一:定期手 ...
- API网关实践-网易云轻舟微服务
微服务最佳实践中,我们需要通过统一的 API 网关进行服务能力的共享,API 网关为用户提供发布.管理.保护和监控 API的能力,帮助用户在自己的多个系统之间,或者内部系统与合作伙伴以及第三方的系统之 ...
- SELECT *问题
1.mysql拿到一条命令,会去解析命令.优化查询,然后去存储引擎执行查找.SELECT * 语句取出表中的所有字段,会解析更多的 对象,字段,权限,属性相关,不论该字段的数据对调用的应用程序是否有用 ...
- 深入探讨Spring Boot中的参数传递
深入探讨Spring Boot中的参数传递 在Spring Boot开发中,参数传递是一个非常常见且重要的操作.无论是处理HTTP请求,还是在方法之间传递数据,理解和掌握参数传递的各种方式都能让我们的 ...