如何实现子goroutine与主线程的同步

第一种方式:time.sleep(),这种方式很太死板,就不演示了。

第二种方式:使用channel机制,每个goroutine传一个channel进去然后往里写数据,在再主线程中读取这些channel,直到全部读到数据了子goroutine也就全部运行完了,那么主goroutine也就可以结束了。这种模式是子线程去通知主线程结束。

package main

import (

"fmt"

)

func main() {

var chanTest = make(chan int)

var chanMain = make(chan int)

go func() {

for i := 0; i < 20; i++ {

chanTest

fmt.Println("生产者写入数据", i)

}

close(chanTest)

}()

go func() {

for v := range chanTest {

fmt.Println("\t消费者读出数据", v)

}

chanMain

}()

go func() {

for v := range chanTest {

fmt.Println("\t\t消费者读出数据", v)

}

chanMain

}()

}

第三种方式:使用context中cancel函数,这种模式是主线程去通知子线程结束。

package main

import (

"context"

"fmt"

"time"

)

func gen(ctx context.Context)

dst := make(chan int)

n := 1

go func() {

for {

select {

case

fmt.Println("i exited")

return // returning not to leak the goroutine

case dst

n++

}

}

}()

return dst

}

func test() {

ctx, cancel := context.WithCancel(context.Background())

defer cancel() // cancel when we are finished consuming integers

intChan := gen(ctx)

for n := range intChan {

fmt.Println(n)

if n == 5 {

break

}

}

}

func main() {

test()

time.Sleep(time.Hour)

}

第四种方式:sync.WaitGroup模式,Add方法设置等待子goroutine的数量,使用Done方法设置等待子goroutine的数量减1,当等待的数量等于0时,Wait函数返回。

//使用golang中sync.WaitGroup来实现协程同步

package main

import (

"fmt"

"net/http"

"io/ioutil"

"time"

"os"

"sync"

)

var waitGroup = new(sync.WaitGroup)

func download(i int ){

url := fmt.Sprintf("http://pic2016.ytqmx.com:82/2016/0919/41/%d.jpg", i)

fmt.Printf("开始下载:%s\n", url)

res,err := http.Get(url)

if err != nil || res.StatusCode != 200{

fmt.Printf("下载失败:%s", res.Request.URL)

}

fmt.Printf("开始读取文件内容,url=%s\n", url)

data ,err2 := ioutil.ReadAll(res.Body)

if err2 != nil {

fmt.Printf("读取数据失败")

}

ioutil.WriteFile(fmt.Sprintf("pic2016/1_%d.jpg", i), data, 0644)

//计数器-1

waitGroup.Done()

}

func main() {

//创建多个协程,同时下载多个图片

os.MkdirAll("pic2016", 0666)

now := time.Now()

for i :=1; i<24; i++ {

//计数器+1

waitGroup.Add(1)

go download(i)

}

//等待所有协程操作完成

waitGroup.Wait()

fmt.Printf("下载总时间:%v\n", time.Now().Sub(now))

}

php协程和goroutine,golang中四种方式实现子goroutine与主协程的同步相关推荐

  1. MySQL中四种方式给字段添加索引

    MySQL中给字段创建索引的四种方式: 添加主键 ALTER TABLE tbl_name ADD PRIMARY KEY (col_list); 该语句添加一个主键,这意味着索引值必须是唯一的,且不 ...

  2. golang实现四种排序(快速,冒泡,插入,选择)

    本文系转载 原文地址: http://www.limerence2017.com/2019/06/29/golang07/ 前面已经介绍golang基本的语法和容器了,这一篇文章用golang实现四种 ...

  3. 如何在html添加css样式表,网页中添加CSS样式表的四种方式

    本文向大家描述一下网页中添加CSS样式表的四种方式,首先让我们来看一下CSS样式表文件的优势,主要体现在两个方面,请看下文详细介绍. CSS样式表文件的优势表现在两个方面: ***,简化了网页的格式代 ...

  4. 解决存储过程中数据安全问题的四种方式

    随着科技的不断发展,数据量也正在呈指数倍的增加.在这样一个大背景下,存储产品成为了时下市场中最热的产品.而数据的安全性也变得尤为重要.后端存储已经逐渐成为企业业务系统的核心和关键. 一般而言,我们有四 ...

  5. Action中取得request,session的四种方式

    Action中取得request,session的四种方式 在Struts2中,从Action中取得request,session的对象进行应用是开发中的必需步骤,那么如何从Action中取得这些对象 ...

  6. golang 读写文件的四种方式

    读文件 读取的文件放在file/test:也就是file包下的test这个文件,里面写多一点文件 读文件方式一:利用ioutil.ReadFile直接从文件读取到[]byte中 func Read0( ...

  7. php中四种webservice实现的简单架构方法及实例

    PHP本身的SOAP,开源的NUSOAP,商业版的PHPRPC,以及使用二进制传输数据流的HessianPHP,那么一下就简单的介绍下这几种webservice在php中的使用,虽然网上也有很多这方面 ...

  8. php 数组存入mysql_PHP将数组存入数据库中的四种方式

    1.implode()和explode()方式 2.print_r()和自定义函数方式 3.serialize()和unserialize()方式 4.json_encode()和json_decod ...

  9. Android中四种补间动画的使用示例(附代码下载)

    场景 Android中四种补间动画. 透明度渐变动画 旋转动画 缩放动画 平移动画 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的 ...

最新文章

  1. Python 将数据框类型转为字典类型
  2. 非常好的dllimport 文章--在 C# 中通过 P/Invoke 调用Win32 DLL
  3. IT项目管理总结:第三章 项目管理过程组
  4. NLog自定义Layout Renderer
  5. 22岁少年破解史上最严重网络攻击,拯救全球互联网,三个月后却被FBI逮捕
  6. C语言超级玛丽菜单模块源码
  7. 2019年的一个小目标,成为csdn的博客专家,纪念一下
  8. selenium IDE的基本命令
  9. 最强读心术!脑波直接转语音,你的秘密已无处藏身 | Nature子刊
  10. Shell 操作(一)
  11. java list 泛型 转换_Java中List与数组互相转换
  12. .NET的垃圾回收机制引发的问题
  13. python论文降重_论文怕被查重怎么办?你的降重神器来了|简明python教程|python入门|python教程...
  14. 陶哲轩:一个华裔数学天才的传奇
  15. 对象存储BOS服务介绍
  16. day_05 运算符 if和while的使用
  17. burpSuit抓取app的数据包
  18. 华为鸿蒙目标一年跨过生死线
  19. 【人工智能】谭铁牛院士:人工智能新动态
  20. 雨林木风欲借Linux洗白走上大雅之堂?

热门文章

  1. SAP Spartacus list view里router-outlet的填充逻辑
  2. 使用纯粹的ABAP位操作实现两个整数相加
  3. How to suppress email sending when operating on Activity
  4. SAP Kyma发布到SAP Marketing Cloud的事件
  5. 如何在Android Studio里关掉instant run
  6. SAP CRM product customizing下载的第四个队列
  7. CRM呼叫中心inbox的调试步骤
  8. CRM呼叫中心和社交媒体集成的技术实现
  9. what does the checkbox Continue mean in Text Access Sequence customizing
  10. 根据extension field搜索product的技术实现