golang学习笔记 --- goroutine
- package main
- import (
- "fmt"
- "io"
- "io/ioutil"
- "net/http"
- "os"
- "time"
- )
- func main() {
- start := time.Now()
- ch := make(chan string)
- for _, url := range os.Args[1:] {
- go fetch(url, ch) // start a goroutine
- }
- for range os.Args[1:] {
- fmt.Println(<-ch) // receive from channel ch
- }
- fmt.Printf("%.2fs elapsed\n", time.Since(start).Seconds())
- }
- func fetch(url string, ch chan<- string) {
- start := time.Now()
- resp, err := http.Get(url)
- if err != nil {
- ch <- fmt.Sprint(err) // send to channel ch
- return
- }
- nbytes, err := io.Copy(ioutil.Discard, resp.Body)
- resp.Body.Close() // don't leak resources
- if err != nil {
- ch <- fmt.Sprintf("while reading %s: %v", url, err)
- return
- }
- secs := time.Since(start).Seconds()
- ch <- fmt.Sprintf("%.2fs %7d %s", secs, nbytes, url)
- }
goroutine是一种函数的并发执行方式,而channel是用来在goroutine之间进行参数传递。
main函数本身也运行在一个goroutine中,而go function则表示创建一个新的goroutine,并在
这个新的goroutine中执行这个函数。
main函数中用make函数创建了一个传递string类型参数的channel,对每一个命令行参数,我
们都用go这个关键字来创建一个goroutine,并且让函数在这个goroutine异步执行http.Get方
法。这个程序里的io.Copy会把响应的Body内容拷贝到ioutil.Discard输出流中(译注:可以把
这个变量看作一个垃圾桶,可以向里面写一些不需要的数据),因为我们需要这个方法返回
的字节数,但是又不想要其内容。每当请求返回内容时,fetch函数都会往ch这个channel里写
入一个字符串,由main函数里的第二个for循环来处理并打印channel里的这个字符串。
当一个goroutine尝试在一个channel上做send或者receive操作时,这个goroutine会阻塞在调
用处,直到另一个goroutine往这个channel里写入、或者接收值,这样两个goroutine才会继续
执行channel操作之后的逻辑。在这个例子中,每一个fetch函数在执行时都会往channel里发
送一个值(ch <- expression),主函数负责接收这些值(<-ch)。这个程序中我们用main函数来接
收所有fetch函数传回的字符串,可以避免在goroutine异步执行还没有完成时main函数提前退
出。
golang学习笔记 --- goroutine的更多相关文章
- golang学习笔记6 beego项目路由设置
golang学习笔记5 beego项目路由设置 前面我们已经创建了 beego 项目,而且我们也看到它已经运行起来了,那么是如何运行起来的呢?让我们从入口文件先分析起来吧: package main ...
- go语言,golang学习笔记2 web框架选择
go语言,golang学习笔记2 web框架选择 用什么go web框架比较好呢?能不能推荐个中文资料多的web框架呢? beego框架用的人最多,中文资料最多 首页 - beego: 简约 & ...
- golang学习笔记20 一道考察对并发多协程操作一个共享变量的面试题
golang学习笔记20 一道考察对并发多协程操作一个共享变量的面试题 下面这个程序运行的能num结果是什么? package main import ( "fmt" " ...
- golang学习笔记19 用Golang实现以太坊代币转账
golang学习笔记19 用Golang实现以太坊代币转账 在以太坊区块链中,我们称代币为Token,是以太坊区块链中每个人都可以任意发行的数字资产.并且它必须是遵循erc20标准的,至于erc20标 ...
- golang学习笔记18 用go语言编写移动端sdk和app开发gomobile
golang学习笔记18 用go语言编写移动端sdk和app开发gomobile gomobile的使用-用go语言编写移动端sdk和app开发https://blog.csdn.net/u01249 ...
- golang学习笔记17 爬虫技术路线图,python,java,nodejs,go语言,scrapy主流框架介绍
golang学习笔记17 爬虫技术路线图,python,java,nodejs,go语言,scrapy主流框架介绍 go语言爬虫框架:gocolly/colly,goquery,colly,chrom ...
- golang学习笔记16 beego orm 数据库操作
golang学习笔记16 beego orm 数据库操作 beego ORM 是一个强大的 Go 语言 ORM 框架.她的灵感主要来自 Django ORM 和 SQLAlchemy. 目前该框架仍处 ...
- golang学习笔记14 golang substring 截取字符串
golang学习笔记14 golang substring 截取字符串golang 没有java那样的substring函数,但支持直接根据 index 截取字符串mystr := "hel ...
- golang学习笔记13 Golang 类型转换整理 go语言string、int、int64、float64、complex 互相转换
golang学习笔记13 Golang 类型转换整理 go语言string.int.int64.float64.complex 互相转换 #string到intint,err:=strconv.Ato ...
随机推荐
- ASP.NET使用包含文件,比如asp中用include的方法
不是母板页,包含文件在ASP.NET中是如何使用的? 在网页里包含另一个网页(或文件)方法如下: 一.要包含的文件是css文件的话,用 <link type=text/css rel=style ...
- 微信小程序 - 上传图片组件
2019-01-08 更新至1.1:修复了一些问题 2019-03-14 全面更新,推荐:https://www.cnblogs.com/cisum/p/10533559.html 使用了es8的as ...
- vCenter Server Virtual Appliance features and benefits
http://vmwire.com/tag/vcsa/ Installed on SUSE Linux Enterprise Server 11 x64. OVF when deployed is c ...
- Zoning and LUN Masking
In a SAN ( Storage Area Network ), if all the hosts are allowed to access all the drives in the SAN, ...
- Spring 在+publicId+和+systemId+之间需要有空格
今天配置Spring,遇到一个很奇葩的问题: Spring.xml的配置文件内容: <?xml version="1.0" encoding="UTF-8" ...
- Spark的运行模式(1)--Local和Standalone
Spark一共有5种运行模式:Local,Standalone,Yarn-Cluster,Yarn-Client和Mesos. 1. Local Local模式即单机模式,如果在命令语句中不加任何配置 ...
- Centos 7 文件和目录管理
查看权限在终端输入: ls -l xxx.xxx (xxx.xxx是文件名) 那么就会出现相类似的信息,主要都是这些: -rw-rw-r-- 其中: 最前面那个 - 代表的是类型 中 ...
- 使用fuel6.0自己主动安装openstack-juno版本号(2)
上篇中fuel_master已经安装完毕.接下来我们介绍怎样新建一个openstack环境. 1,在web界面中新建openstack环境: 点击主界面的加入button,新建openstack环境. ...
- 怎么解决numpy和matplotlib无法安装问题
使用python setup.py install 折腾了半天没办法解决,最终用 “pip install 包名” 这个办法解决了. 以后忠诚的爱上了pip了 numpy不要轻易升级,升级可能会 ...
- urlparse基本运用
# -*- coding: cp936 -*- #python 27 #xiaodeng #urlparse基本运用 import urllib,urlparse def urlparse_test( ...