教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 Go语言 goroutine一些常用技巧

Go语言 goroutine一些常用技巧

发布时间:2022-03-07   编辑:jiaochengji.com
教程集为您提供Go语言 goroutine一些常用技巧等资源,欢迎您收藏本站,我们将为您提供最新的Go语言 goroutine一些常用技巧资源

<h2 style="font-family:HannotateSC-W5"> </h2>

<span style="font-family:Hannotate SC; font-size:12px"><span style="font-weight:normal">1. 操作系统与运行库
“运行库”这个词其实不止包括用于和编译后的目标执行程序进行链接的库文件,也包括了脚本语言或字节码解释型语言的运行环境,譬如Python,C#的CLR,Java的JRE。
对系统调用的封装只是运行库的很小一部分功能,运行库通常还提供了诸如字符串处理、数学计算、常用数据结构容器等等不需要操作系统支持的功能,同时,运行库也会对操作系统支持的功能提供更易用更高级的封装,譬如带缓存和格式的IO、线程池。
1. 支持新的语义或语法,从而便于我们描述和解决问题。譬如Java的泛型、Annotation、lambda表达式。
2. 提供了新的工具或类库,减少了我们开发的代码量。譬如Python 2.7的argparse
3. 对系统调用有了更良好更全面的封装,使我们可以做到以前在这个语言环境里做不到或很难做到的事情。譬如Java NIO
2. 并发与并行 (Concurrency and Parallelism)
并发是指程序的逻辑结构。非并发的程序只有一个逻辑控制流,即顺序执行的(Sequential)程序。
并行是指程序的运行状态。如果一个程序在某一时刻被多个CPU流水线同时进行处理,那么我们就说这个程序是以并行的形式在运行。
3. 线程的调度
4. 并发编程框架
5. goroutine</span></span>

<span style="font-family:Hannotate SC; font-size:12px"><span style="font-weight:normal">(1) goroutine是Go语言运行库的功能,不是操作系统提供的功能,goroutine不是用线程实现的。具体可参见Go语言源码里的http://golang.org/src/pkg/runtime/proc.c</span></span>

<span style="font-family:Hannotate SC; font-size:12px"><span style="font-weight:normal">(2) goroutine就是一段代码,一个函数入口,以及在堆上为其分配的一个堆栈。所以它非常廉价,我们可以很轻松的创建上万个goroutine,但它们并不是被操作系统所调度执行</span></span>

<span style="font-family:Hannotate SC; font-size:12px"><span style="font-weight:normal">(3) 除了被系统调用阻塞的线程外,Go运行库最多会启动$GOMAXPROCS个线程来运行goroutine</span></span>

<span style="font-family:Hannotate SC; font-size:12px"><span style="font-weight:normal">(4) goroutine是协作式调度的,如果goroutine会执行很长时间,而且不是通过等待读取或写入channel的数据来同步的话,就需要主动调用Gosched()来让出CPU</span></span>

<span style="font-family:Hannotate SC; font-size:12px"><span style="font-weight:normal">(5) 和所有其他并发框架里的协程一样,goroutine里所谓“无锁”的优点只在单线程下有效,如果$GOMAXPROCS > 1并且协程间需要通信,Go运行库会负责加锁保护数据,这也是为什么sieve.go这样的例子在多CPU多线程时反而更慢的原因</span></span>

<span style="font-family:Hannotate SC; font-size:12px"><span style="font-weight:normal">(6) Web等服务端程序要处理的请求从本质上来讲是并行处理的问题,每个请求基本独立,互不依赖,几乎没有数据交互,这不是一个并发编程的模型,而并发编程框架只是解决了其语义表述的复杂性,并不是从根本上提高处理的效率,也许是并发连接和并发编程的英文都是concurrent吧,很容易产生“并发编程框架和coroutine可以高效处理大量并发连接”的误解。</span></span>

<span style="font-family:Hannotate SC; font-size:12px"><span style="font-weight:normal">(7) Go语言运行库封装了异步IO,所以可以写出貌似并发数很多的服务端,可即使我们通过调整$GOMAXPROCS来充分利用多核CPU并行处理,其效率也不如我们利用IO事件驱动设计的、按照事务类型划分好合适比例的线程池。在响应时间上,协作式调度是硬伤。</span></span>

<span style="font-family:Hannotate SC; font-size:12px"><span style="font-weight:normal">(8) goroutine最大的价值是其实现了并发协程和实际并行执行的线程的映射以及动态扩展,随着其运行库的不断发展和完善,其性能一定会越来越好,尤其是在CPU核数越来越多的未来,终有一天我们会为了代码的简洁和可维护性而放弃那一点点性能的差别。</span></span>



到此这篇关于“Go语言 goroutine一些常用技巧”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
兄弟连golang神技(1)-关于 Go 语言的介绍
想系统学习GO语言(Golang
简单理解 Goroutine 是如何工作的
Go语言爱好者周刊:第 78 期 — 这道关于 goroutine 的题
Goroutine的调度分析(一)
Go语言 goroutine一些常用技巧
Go 语言到底适合干什么?
初识 Go 语言
图解 Go 并发编程
Go语言基础(3)

[关闭]
~ ~