搜索
高级检索
高级搜索
书       名 :
著       者 :
出  版  社 :
I  S  B  N:
文献来源:
出版时间 :
Go并发编程实战
0.00    
图书来源: 浙江图书馆(由图书馆配书)
  • 配送范围:
    全国(除港澳台地区)
  • ISBN:
    9787115373984
  • 作      者:
    郝林著
  • 出 版 社 :
    人民邮电出版社
  • 出版日期:
    2015
收藏
编辑推荐
  全面介绍Go语言基础编程。《Go并发编程实战》通过5个章节详细地介绍了Go的语言细节和底层实现细节,贯穿于语言层面和源码层面,让读者可以对Go语言的实现有更加深刻的理解。  直击Go语言的精髓和亮点——并发编程技术。本书的看点和特色在于并发编程。《Go并发编程实战》深入剖析了并发编程模型及其在多个编程实战中的应用,重点阐述了Go语言并发编程模型和机制,详细介绍了Go并发编程的核心要素——Goroutine和Channel的概念、原理、基本用法和高级技巧应用,以及编写并发程序的过程中对各种同步工具的运用等问题。  示例全面详细。《Go并发编程实战》展示和细致讲解了各种各样的代码实例,尤其是包含了像载荷发生器和网络爬虫框架这样的实用程序,让读者可以对并发、线程、信号等概念有清晰的理解。
展开
作者简介
  郝林,Gopher、高级Java软件工程师、Python程序员和Linux爱好者。目前在宜信公司的小微企业增值服务中心任软件系统架构师。曾就职于搜狐网多年,并任Java项目经理。在互联网软件的设计和开发方面拥有丰富的实战经验。微博名:特价萝卜。
展开
内容介绍
  《Go并发编程实战》全面介绍了Go语言的特点、安装部署环境、工程规范、工具链、语言语法、并发编程模型以及在多个编程实战中的应用,重点阐述了Go语言并发编程模型和机制。本书共分为四个部分,介绍了Go语言编程环境搭建、Go语言基础编程、Go语言并发编程方法及其原理,以及使用Go语言开发的应用系统的案例讲解。
  《Go并发编程实战》适用于有一定计算机编程基础的从业者以及对Go语言编程感兴趣的爱好者,非常适合作为Go语言编程进阶教程。
展开
精彩书评
  “并发编程的支持无疑是Go语言的亮点。但是,尽管Go语言大幅降低了并发编程的门槛,但至今大部分开发者对如何运用该语言编写高并发程序的认知仍然有限。我很高兴能有一本专门探讨Go语言并发编程的书。《Go并发编程实战》这本书对Go语言并发编程的探讨之深入、讲解之细腻是它的一大亮点。同时,这本书也非常适合作为Go语言的入门教材,即便是对Go语言了解不深甚至从未接触的人也能从中获益。另外,书中的示例也非常有价值,它们贴切地展现了用Go语言进行编程的方法和技巧。总之,《Go并发编程实战》是一份难得的Go语言学习资料。”
  ——许式伟,七牛云存储CEO

  “Go语言是服务端编程领域非常热门的语言,市面上关于Go语言的图书并不少见,但都没有像《Go并发编程实战》这样,把Go语言精髓的部分——并发编程讲解得如此深入浅出,明白透彻。本书系统地梳理了并发编程的概念和原理,并辅以详细的Go语言程序示例,非常容易让读者对并发、线程、信号等概念有清晰的理解。不管你是刚开始接触Go语言,还是已经非常熟悉它了,如果想了解Go语言更多的技术内幕,这本书都值得仔细研读,相信读者能够从中受益匪浅。”
  ——郭理靖,京东云平台开放云事业部总监

  “Go语言从诞生之日起就充满了争议,但是社区对它的热情却越来越高,今年InfoWorld的开源项目Docker就是用Go写的,可见Go闪烁着越来越耀眼的光芒。郝林的这本书非常注重对Go编程细节的清晰阐释,这在国内原创技术书中是不多见的。书中示例选取精心得当,深入浅出,完全没有那种看完仍需要参悟的感觉。这是一本Go学习者真正需要的图书。”
  ——程显峰,蓝海讯通COO
展开
精彩书摘
  4.线程安全性
  在本小节的最后,我们来简要地了解一下线程安全性这个概念。如果有一个代码块,它可以被多个线程并发地执行,且总能够产生预期的结果,那么该代码块就是线程安全的(thread-safe)。例如,如果代码块中包含了对共享数据的更新操作,那么这个代码块通常就是非线程安全的。但是,如果该代码块中的类似操作都处于临界区之中,那么这个代码块就是线程安全的。
  经常被置于线程安全问题之中的代码块就是函数。这不仅仅是因为函数是最常用的独立代码块,更是因为函数的线程安全性有着更多的含义。让函数具有线程安全性的最有效方式就是使其可重入(reentrant)。如果某个进程中的所有线程都可以并发的对一个函数进行调用,并且无论它们调用该函数的实际执行情况怎样,该函数都可以产生预期的结果,那么就可以说这个函数是可重入的。更通俗地讲,如果多个线程并发的调用该函数与它们以任意顺序依次地调用它所产生的效果总是相同的,那么该函数就是_个可重入函数。
  如果一个函数把共享数据的值作为其返回的结果或者包含于其返回的结果中,那么该函数就肯定不是一个可重入函数。因为,如果其他线程在该结果返回的过程中更新了相关的共享数据,那么函数的调用方得到的结果就很可能不是该函数真正想返回的那个结果。这种情况是无法通过使用互斥量来解决的。因此,为了使函数可重入,我们必须也只能杜绝在该函数的返回结果中掺杂任何共享数据。当然,如果这些共享数据都是完全不可被更新的话,就不会存在这样的隐患。一条更加通用的规则是,任何内含了对共享数据进行操作的代码的函数都可以被视为不可重入的函数。
  使函数成为可重入函数是实现其线程安全性的最直接的一种方式,并且也是最简单和最高效的方式。我们应该尽量编写可重入的函数。但是,如果我们无法办到这一点,或者该函数中需要调用某些不可重人的函数,那么就需要采取另一种办法——使用互斥量把相关的代码保护起来。
  当然,为了实现线程安全的函数,把其中的所有代码都置于临界区之中是可行的。但是,这往往也是最低效的一种方法。我们应该仔细地从函数体中查找出操作共享数据的代码并用互斥量把它们保护起来。如果可能的话,我们还应该把这些代码从函数体中分离出来。这样有利于在之后施加保护措施。分离的方式可以是把它们聚集在一起,也可以是把它们独立成一个或多个函数。或者,更进一步地,把它们抽象并组装成一个数据结构并使这个数据结构具有线程安全性。当然,是否分离这些代码以及以怎样的方式分离它们取决于很多因素。最简单的方式就是把每条涉及操作共享数据的语句都用互斥量保护起来。这通常也是我们最初采用的方式。
  无论怎样,互斥量的使用总会耗费一定的系统资源和时间。正如前文所说,使用互斥量的过程中总会存在着某些博弈和权衡。如果在一个代码块中仅包含对共享数据的访问操作而不包含对它们的更新操作,那么在这个代码块之内就可以不使用互斥量。但一个必要的前提是,必须在真正使用共享数据之前就把它们完全复制到当前线程的线程栈之中。也就是说,线程需要自己维护一份其需要使用到的共享数据的副本。对于函数来说,这样的副本是作为其局部变量存在的。
  ……
展开
目录

第一部分 Go语言的世界
第1章 初识Go语言
1.1Go语言特性一瞥
1.2Go语言的优劣
1.3怎样学习Go语言
1.4本章小结
第2章 Go语言环境搭建
2.1安装和设置
2.1.1Linux
2.1.2Windows
2.2工程结构
2.2.1工作区
2.2.2GOPATH
2.2.3源码文件
2.2.4代码包
2.3标准命令概述
2.4本章小结

第二部分 编程基础
第3章 词法与数据类型
3.1基本词法
3.1.1标识符
3.1.2关键字
3.1.3字面量
3.1.4类型
3.1.5操作符
3.1.6表达式
3.2数据类型
3.2.1基本数据类型
3.2.2数组
3.2.3切片
3.2.4字典
3.2.5函数和方法
3.2.6接口
3.2.7结构体
3.2.8指针
3.2.9数据初始化
3.3数据的使用
3.3.1赋值语句
3.3.2常量与变量
3.3.3可比性与有序性
3.3.4类型转换
3.3.5内建函数
3.4本章小结
第4章 流程控制方法
4.1基本流程控制
4.1.1代码块和作用域
4.1.2if语句
4.1.3switch语句
4.1.4for语句
4.1.5goto语句
4.2defer语句
4.3异常处理
4.3.1error
4.3.2panic和recover
4.4实战演练--Set
4.5实战演练--OrderedMap
4.6本章小结
第5章 程序测试和文档
5.1程序测试
5.1.1功能测试
5.1.2基准测试
5.1.3样本测试
5.1.4测试运行记录
5.1.5测试覆盖率
5.2程序文档
5.3本章小结

第三部分 并发编程
第6章 并发编程综述
6.1并发编程基础
6.1.1串行程序与并发程序
6.1.2并发程序与并行程序
6.1.3并发程序与并发系统
6.1.4并发程序的不确定性
6.1.5并发程序内部的交互
6.2多进程编程
6.2.1进程
6.2.2关于同步
6.2.3管道
6.2.4信号
6.2.5Socket
6.3多线程编程
6.3.1线程
6.3.2线程的同步
6.4多线程与多进程
6.5多核时代的并发编程
6.6Go语言的并发编程
6.6.1线程实现模型
6.6.2调度器
6.6.3更多的细节
6.7本章小结
第7章 Goroutine和Channel
7.1Goroutine的使用
7.1.1go语句与Goroutine
7.1.2Goroutine的运作过程
7.1.3runtime包与Goroutine
7.1.4HappensBefore
7.2Channel
7.2.1Channel是什么
7.2.2单向Channel
7.2.3for语句与Channel
7.2.4select语句
7.2.5非缓冲的Channel
7.2.6time包与Channel
7.3实战演练--载荷发生器
7.3.1参数和结果
7.3.2基本结构
7.3.3初始化
7.3.4启动和停止
7.3.5调用器和功能测试
7.4本章小结
第8章 同步
8.1锁的使用
8.2条件变量
8.3原子操作
8.4只会执行一次
8.5WaitGroup
8.6临时对象池
8.7实战演练--ConcurrentMap
8.8本章小结

第四部分 编程实战
第9章 一个网络爬虫框架的设计和实现
9.1网络爬虫与框架
9.2功能需求和分析
9.3总体设计
9.4详细设计
9.4.1基本数据结构
9.4.2接口的设计
9.5中间件的实现
9.5.1通道管理器
9.5.2实体池
9.5.3停止信号
9.5.4ID生成器
9.6处理模块的实现
9.6.1网页下载器
9.6.2分析器
9.6.3条目处理管道
9.7调度器的实现
9.7.1基本结构
9.7.2主要的函数和方法
9.7.3请求缓存
9.7.4摘要信息的类型
9.8一个使用演示
9.8.1再看调度器参数
9.8.2开启调度器
9.8.3调度器监控函数
9.9当前的不足和解决思路
9.10本章小结

附录Go语言的学习资源

展开
加入书架成功!
收藏图书成功!
我知道了(3)
发表书评
读者登录

请选择您读者所在的图书馆

选择图书馆
浙江图书馆
点击获取验证码
登录
没有读者证?在线办证