Go程序设计语言1.6 并发获取多个URL

1.6 并发获取多个URL


Go最令人感兴趣和新颖的特点是支持并发编程。这是一个大话题,第8章和第9章将专门讨论,所以此处只是简单了解一下Go主要的并发机制、goroutine和通道(channel)。

下一个程序fetchall和前一个一样获取URL的内容,但是它并发获取很多URL内容,于是这个进程使用的时间不超过耗时最长时间的获取任务,而不是所有获取任务总的时间。这个版本的fetchall丢弃响应的内容,但是报告每一个响应的大小和花费的时间:

 

 

这有一个例子:

 

 

goroutine是一个并发执行的函数。通道是一种允许某一例程向另一个例程传递指定类型的值的通信机制。main函数在一个goroutine中执行,然后go语句创建额外的goroutine。

main函数使用make创建一个字符串通道。对于每个命令行参数,go语句在第一轮循环中启动一个新的goroutine,它异步调用fetch来使用http.Get获取URL内容。io.Copy函数读取响应的内容,然后通过写入ioutil.Discard输出流进行丢弃。Copy返回字节数以及出现的任何错误。每一个结果返回时,fetch发送一行汇总信息到通道ch。main中的第二轮循环接收并且输出那些汇总行。

当一个goroutine试图在一个通道上进行发送或接收操作时,它会阻塞,直到另一个goroutine试图进行接收或发送操作才传递值,并开始处理两个goroutine。本例中,每一个fetch在通道ch上发送一个值(ch <- expression),main函数接收它们(<-ch)。由main来处理所有的输出确保了每个goroutine作为一个整体单元处理,这样就避免了两个goroutine同时完成造成输出交织所带来的风险。

练习1.10:找一个产生大量数据的网站。连续两次运行fetchall,看报告的时间是否会有大的变化,调查缓存情况。每一次获取的内容一样吗?修改fetchall将内容输出到文件,这样可以检查它是否一致。

练习1.11:使用更长的参数列表来尝试fetchall,例如使用alexa.com排名前100万的网站。如果一个网站没有响应,程序的行为是怎样的?(8.9节会通过复制这个例子来描述响应的机制。)

时间: 2024-09-20 04:05:46

Go程序设计语言1.6 并发获取多个URL的相关文章

Go程序设计语言1.5 获取一个URL

1.5 获取一个URL 对许多应用而言,访问互联网上的信息和访问本地文件系统一样重要.Go提供了一系列包,在net包下面分组管理,使用它们可以方便地通过互联网发送和接收信息,使用底层的网络连接,创建服务器,此时Go的并发特性(见第8章)特别有用. 程序fetch展示从互联网获取信息的最小需求,它获取每个指定URL的内容,然后不加解析地输出.fetch来自curl这个非常重要的工具.显然可以使用这些数据做更多的事情,但这里只讲基本的思路,本书将会频繁用到这个程序:   这个程序使用的函数来自两个包

Go程序设计语言导读

前 言 The Go Programming Language "Go是一种开源的程序设计语言,它意在使得人们能够方便地构建简单.可靠.高效的软件."(来自Go官网golang.org) Go在2007年9月形成构想,并于2009年11月发布,其发明人是Robert Griesemer.Rob Pike和Ken Thompson,这几位都任职于Google.该语言及其配套工具集使得编译和执行既富有表达力又高效,而且使得程序员能够轻松写出可靠.健壮的程序. Go和C从表面上看起来相似,而

《程序分析方法》——1.2 程序设计语言的发展趋势

1.2 程序设计语言的发展趋势 Turbo Pascal编译器的主要编写者以及.NET框架.Delphi和C#之父--Anders Hejlsberg认为,相对于近几十年来计算机硬件的飞速发展,程序语言的改进不是很明显,主要的原因在于人们更关注"工具"."框架"或"开发方法"的变革和创新,而忽略了语言的改进.程序设计离不开程序设计语言,程序设计语言与"工具"."框架"或"开发方法"等一样

为什么会有这么多种程序设计语言?

传说人类建造通天塔触怒上帝,上帝施法使人类语言混乱彼此之间无法交流.这就是说各种各样的语言其实就是祸乱之源--只会导致交流的不便.可是看看如今的程 序设计语言的数量,你会怀疑人类是否又在造"通天塔"了?真的有这么多语言的必要吗?我到底要学习多少种程序设计语言才够用呢? 根据维基的资料,可以称得上相对"主流"(有人用.有文档)的程序设计语言至少有600种, 还有大量的商业化失败.实用性不高.语言小众(这里的"语言"指的是编码的语言,一般的程序设计语

Go语言扫描目录并获取相关信息的方法_Golang

本文实例讲述了Go语言扫描目录并获取相关信息的方法.分享给大家供大家参考.具体分析如下: 前言:最近看到Go里面有一个func很容易就可以扫描整个目录,并且可以得到相应的目录和文件信息,所以我将其进行了封装,拿到file info的所有信息 这样就可以方便的做其它用途了. 直接上代码,代码基于Go version 1 复制代码 代码如下: package main import (     "path/filepath"     "os"     "fla

【软考教程】程序设计语言基础

继续软考教程的学习,在第1章,我们主要是对计算机的组成和工作原理做了一定了解,可以说,在他的带领下,我们对计算机硬件方面的知识,有了更加坚实的基础. 第2章,程序设计语言基础知识.不看内容,光从标题来看,并不会觉得陌生."程序设计语言",至今,我们已经接触过不止一种了,从最初的VB.到后来的VB.NET.C#.C++,软考前个阶段,我们还见到了早有耳闻的Java世界. 那么,下面就跟随着"设计语言"的脚步,一起发现编程路上美丽的风光吧. 想要对程序设计语言有个宏观上

最受欢迎的十大程序设计语言排行榜更新(10月版)

在最受欢迎的程序设计语言排行榜上最值得关注的是Ruby从一年前的第十三名上升到第十位.无论如何,按照TIOBE程序设计区域指标的数据,这是个神奇的事情.TIOBE程序设计区域指标用于标识程序设计语言的普及度,并根据世界范围的熟练工程师.课程和第三方供应商对程序设计语言的实际使用率,每月更新一次数据. 流行的搜索引擎Google. MSN和Yahoo!都被用于计算此指标的评估结果,根据TIOBE所言.TIOBE在它的网站上发出如下告诫: 注意:TIOBE指标不是为了衡量哪个程设计语言是最好的或者是

c语言编程-这段C程序设计语言书上的代码,运行后按回车只换行并没有输出最长的行,为什么

问题描述 这段C程序设计语言书上的代码,运行后按回车只换行并没有输出最长的行,为什么 #include#define MAXLINE 1000int getline(char line[]int maxline);void copy(char to[]char from[]);main(){int len;int max;char line[MAXLINE];char longest[MAXLINE];max = 0;while ((len = getline(lineMAXLINE))>0)i

Python v3.2发布 面向对象直译式计算机程序设计语言

Python是一种面向对象.直译式计算机程序设计语言,也是一种http://www.aliyun.com/zixun/aggregation/17547.html">功能强大而完善的通用型语言,已经具有十多年的发展历史,成熟且稳定.这种语言具有非常简捷而清晰的语法特点,适合完成各种高层任务,几乎可以在所有的操作系统中运行.目前,基于这种语言的相关技术正在飞速的发展,用户数量急剧扩大,相关的资源非常多. 虽然Python可能被粗略地分类为"脚本语言"(script lan