2021老牌一键重装系统 最简单好用的系统重装软件 全网独家技术/支持GPT-UEFI一键装机 完美兼容市面所有主板 支持安装windows XP/7/8/10 系统
当前位置:首页 > 教程 > 系统帮助

Go语言是为了并发而产生的

来源:win7旗舰版    2021-04-22     分类:win7 64位
随着处理器技术的发展,单核时代以提升处理器频率来提高运行效率的方式遇到了瓶颈,单核 CPU 发展的停滞,给多核 CPU 的发展带来了机遇。相应地,编程语言也开始逐步向并行化的方向发展。

虽然一些编程语言的框架在不断地提高多核资源使用效率,例如 Java 的 Netty 等,但仍然需要开发人员花费大量的时间和精力搞懂这些框架的运行原理后才能熟练掌握。

作为程序员,要开发出能充分利用硬件资源的应用程序是一件很难的事情。现代计算机都拥有多个核,但是大部分编程语言都没有有效的工具让程序可以轻易利用这些资源。编程时需要写大量的线程同步代码来利用多个核,很容易导致错误。

Go语言正是在多核和网络化的时代背景下诞生的原生支持并发的编程语言。Go语言从底层原生支持并发,无须第三方库,开发人员可以很轻松地在编写程序时决定怎么使用 CPU 资源。

Go语言的并发是基于 goroutine 的,goroutine 类似于线程,但并非线程。可以将 goroutine 理解为一种虚拟线程。Go语言运行时会参与调度 goroutine,并将 goroutine 合理地分配到每个 CPU 中,最大限度地使用 CPU 性能。

多个 goroutine 中,Go语言使用通道(channel)进行通信,通道是一种内置的数据结构,可以让用户在不同的 goroutine 之间同步发送具有类型的消息。这让编程模型更倾向于在 goroutine 之间发送消息,而不是让多个 goroutine 争夺同一个数据的使用权。

程序可以将需要并发的环节设计为生产者模式和消费者的模式,将数据放入通道。通道另外一端的代码将这些数据进行并发计算并返回结果,如下图所示。

提示:Go语言通过通道可以实现多个 goroutine 之间内存共享。

【实例】生产者每秒生成一个字符串,并通过通道传给消费者,生产者使用两个 goroutine 并发运行,消费者在 main() 函数的 goroutine 中进行处理。

 
  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "math/rand"
  6. "time"
  7. )
  8.  
  9. // 数据生产者
  10. func producer(header string, channel chan<- string) {
  11. // 无限循环, 不停地生产数据
  12. for {
  13. // 将随机数和字符串格式化为字符串发送给通道
  14. channel <- fmt.Sprintf("%s: %v", header, rand.Int31())
  15. // 等待1秒
  16. time.Sleep(time.Second)
  17. }
  18. }
  19.  
  20. // 数据消费者
  21. func customer(channel <-chan string) {
  22. // 不停地获取数据
  23. for {
  24. // 从通道中取出数据, 此处会阻塞直到信道中返回数据
  25. message := <-channel
  26. // 打印数据
  27. fmt.Println(message)
  28. }
  29. }
  30.  
  31. func main() {
  32. // 创建一个字符串类型的通道
  33. channel := make(chan string)
  34. // 创建producer()函数的并发goroutine
  35. go producer("cat", channel)
  36. go producer("dog", channel)
  37. // 数据消费函数
  38. customer(channel)
  39. }

运行结果:

dog: 2019727887
cat: 1298498081
dog: 939984059
cat: 1427131847
cat: 911902081
dog: 1474941318
dog: 140954425
cat: 336122540
cat: 208240456
dog: 646203300

对代码的分析:
  • 第 03 行,导入格式化(fmt)、随机数(math/rand)、时间(time)包参与编译。
  • 第 10 行,生产数据的函数,传入一个标记类型的字符串及一个只能写入的通道。
  • 第 13 行,for{} 构成一个无限循环。
  • 第 15 行,使用 rand.Int31() 生成一个随机数,使用 fmt.Sprintf() 函数将 header 和随机数格式化为字符串。
  • 第 18 行,使用 time.Sleep() 函数暂停 1 秒再执行这个函数。如果在 goroutine 中执行时,暂停不会影响其他 goroutine 的执行。
  • 第 23 行,消费数据的函数,传入一个只能写入的通道。
  • 第 26 行,构造一个不断消费消息的循环。
  • 第 28 行,从通道中取出数据。
  • 第 31 行,将取出的数据进行打印。
  • 第 35 行,程序的入口函数,总是在程序开始时执行。
  • 第 37 行,实例化一个字符串类型的通道。
  • 第 39 行和第 40 行,并发执行一个生产者函数,两行分别创建了这个函数搭配不同参数的两个 goroutine。
  • 第 42 行,执行消费者函数通过通道进行数据消费。

更多精彩:笔记本连上wifi却不能上网 https://www.win7gw.com/win10jiqiao/12083.html

系统之家 | win7系统下载 | Win10系统下载 | win10专业版 | 一键重装 | 电脑系统 | 加速吧 | 萝卜家园 | 电脑公司 | win10 | 认证系统 | 联系我们 | 关于我们 | 网站RSS | 老牌一键重装系统QQ群

提供一键重装系统 win7旗舰版,一键重装xp系统,以及重装win10专业版的重装系统软件以及系统重装的相关教程
Copyright@2019  老牌系统  版权所有. All Rights Reserved.  备案号:浙ICP备20007169号-1
老牌一键重装系统唯一网址:www.lpxt.com