3.8 Go之并发和并行
并发和并行
并发(concurrency)
并发是指:
把任务在不同时间点交给处理器进行处理。同一时间点,任务并不会同时运行。
核心概念:
同时管理很多事情
并行的关键:
事情可能只做了一半就被暂停去做别的事情了
并行(parallelism)
并行是指:
把每一个任务分配给每一个处理器独立完成。同一时间点,任务一定是同时运行。
核心概念:
让不同的代码片段在不同的物理处理器上执行。
并行的关键:
同时做很多事情
Go语言设计的哲学
“使用较少的资源做更多的事情”
并发和并行图示
说明:
一个逻辑处理器并发运行goroutine
和两个逻辑处理器并行运行两个并发的gouroutine
区别
Go语言在 GOMAXPROCS 数量与任务数量相等时,可以做到并行执行,但一般情况下都是并发执行。
goroutine和coroutine的区别
goroutine
可能发生并行执行
通信方式:
通过通道的方式来通信--->channel
goroutine的运行机制
抢占式任务处理--->类似现有的多线程、多进程任务处理
特点:
程序对cpu
的控制权由操作系统来管理。
优点:
操作系统如果发现一个应用程序长时间大量地占用CPU
,那么用户有权终止这个任务。
coroutine
始终顺序执行
通信方式:
通过让出和恢复操作来通信--->本质是在操作一个资源的时候不占有它,而只是对资源上锁。使用yield
和resume
操作
coroutine的运行机制
协作式任务处理
特点:
程序在不需要使用cpu
时会主动交出cpu
使用权
缺点:
开发者无意间或者故意让应用程序长时间占用CPU
计算机很容易失去响应或者死机。
It's a lonely road!!!