php协程和goroutine,golang中四种方式实现子goroutine与主协程的同步
如何实现子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与主协程的同步相关推荐
- MySQL中四种方式给字段添加索引
MySQL中给字段创建索引的四种方式: 添加主键 ALTER TABLE tbl_name ADD PRIMARY KEY (col_list); 该语句添加一个主键,这意味着索引值必须是唯一的,且不 ...
- golang实现四种排序(快速,冒泡,插入,选择)
本文系转载 原文地址: http://www.limerence2017.com/2019/06/29/golang07/ 前面已经介绍golang基本的语法和容器了,这一篇文章用golang实现四种 ...
- 如何在html添加css样式表,网页中添加CSS样式表的四种方式
本文向大家描述一下网页中添加CSS样式表的四种方式,首先让我们来看一下CSS样式表文件的优势,主要体现在两个方面,请看下文详细介绍. CSS样式表文件的优势表现在两个方面: ***,简化了网页的格式代 ...
- 解决存储过程中数据安全问题的四种方式
随着科技的不断发展,数据量也正在呈指数倍的增加.在这样一个大背景下,存储产品成为了时下市场中最热的产品.而数据的安全性也变得尤为重要.后端存储已经逐渐成为企业业务系统的核心和关键. 一般而言,我们有四 ...
- Action中取得request,session的四种方式
Action中取得request,session的四种方式 在Struts2中,从Action中取得request,session的对象进行应用是开发中的必需步骤,那么如何从Action中取得这些对象 ...
- golang 读写文件的四种方式
读文件 读取的文件放在file/test:也就是file包下的test这个文件,里面写多一点文件 读文件方式一:利用ioutil.ReadFile直接从文件读取到[]byte中 func Read0( ...
- php中四种webservice实现的简单架构方法及实例
PHP本身的SOAP,开源的NUSOAP,商业版的PHPRPC,以及使用二进制传输数据流的HessianPHP,那么一下就简单的介绍下这几种webservice在php中的使用,虽然网上也有很多这方面 ...
- php 数组存入mysql_PHP将数组存入数据库中的四种方式
1.implode()和explode()方式 2.print_r()和自定义函数方式 3.serialize()和unserialize()方式 4.json_encode()和json_decod ...
- Android中四种补间动画的使用示例(附代码下载)
场景 Android中四种补间动画. 透明度渐变动画 旋转动画 缩放动画 平移动画 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的 ...
最新文章
- Python 将数据框类型转为字典类型
- 非常好的dllimport 文章--在 C# 中通过 P/Invoke 调用Win32 DLL
- IT项目管理总结:第三章 项目管理过程组
- NLog自定义Layout Renderer
- 22岁少年破解史上最严重网络攻击,拯救全球互联网,三个月后却被FBI逮捕
- C语言超级玛丽菜单模块源码
- 2019年的一个小目标,成为csdn的博客专家,纪念一下
- selenium IDE的基本命令
- 最强读心术!脑波直接转语音,你的秘密已无处藏身 | Nature子刊
- Shell 操作(一)
- java list 泛型 转换_Java中List与数组互相转换
- .NET的垃圾回收机制引发的问题
- python论文降重_论文怕被查重怎么办?你的降重神器来了|简明python教程|python入门|python教程...
- 陶哲轩:一个华裔数学天才的传奇
- 对象存储BOS服务介绍
- day_05 运算符 if和while的使用
- burpSuit抓取app的数据包
- 华为鸿蒙目标一年跨过生死线
- 【人工智能】谭铁牛院士:人工智能新动态
- 雨林木风欲借Linux洗白走上大雅之堂?
热门文章
- SAP Spartacus list view里router-outlet的填充逻辑
- 使用纯粹的ABAP位操作实现两个整数相加
- How to suppress email sending when operating on Activity
- SAP Kyma发布到SAP Marketing Cloud的事件
- 如何在Android Studio里关掉instant run
- SAP CRM product customizing下载的第四个队列
- CRM呼叫中心inbox的调试步骤
- CRM呼叫中心和社交媒体集成的技术实现
- what does the checkbox Continue mean in Text Access Sequence customizing
- 根据extension field搜索product的技术实现