关于并发和并行,先看两个示例

示例1

package main

import "fmt"

var quit = make(chan int)
func foo6(){
for i:=0; i<10; i++ {
fmt.Print(i)
}
quit <-0
} func main() {
go foo6()
go foo6() for i:=0; i<2; i++ {
<-quit
}
} 输出结果:
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 疑问:
  难道是顺序执行?

示例2:

package main

import (
"fmt"
"time"
) var quit = make(chan int) func foo6(){
for i:=0; i<10; i++ {
fmt.Print(" ",i)
}
time.Sleep(1 * time.Second)
quit <-0
} func main() {
var startTime = time.Now()
go foo6()
go foo6() for i:=0; i<2; i++ {
<-quit
}
fmt.Println("\n", time.Now().Sub(startTime) )
} 输出结果:
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
1.003077544s 疑问:
显然只花费了1秒多...肯定是并行的...

总结:

默认地, Go所有的goroutines只能在一个线程里跑 。

也就是说, 以上两个代码都不是并行的,但是都是是并发的。

如果当前goroutine不发生阻塞,它是不会让出CPU给其他goroutine的, 所以例子一中的输出会是一个一个goroutine进行的,而sleep函数则阻塞掉了 当前goroutine, 当前goroutine主动让其他goroutine执行, 所以形成了逻辑上的并行, 也就是并发。

真正的并行

为了达到真正的并行,我们需要告诉Go我们允许同时最多使用多个核。

回到起初的例子,我们设置最大开2个原生线程, 我们需要用到runtime包(runtime包是goroutine的调度器):

import (
"fmt"
"runtime"
) var quit chan int = make(chan int) func loop() {
for i := 0; i < 100; i++ { //为了观察,跑多些
fmt.Printf("%d ", i)
}
quit <- 0
} func main() {
runtime.GOMAXPROCS(2) // 最多使用2个核 go loop()
go loop() for i := 0; i < 2; i++ {
<- quit
}
}

参考链接:

https://studygolang.com/articles/1661

Go Concurrency or Parallel的更多相关文章

  1. 并发与并行的区别 The differences between Concurrency and Parallel

    逻辑控制流 在程序加载到内存并执行的时候(进程),操作系统会通过让它和其他进程分时段占用CPU(CPU slices)让它产生自己独占CPU的假象(同时通过虚拟内存让它产生独占内存的假象).在CPU在 ...

  2. Concurrency Is Not Parallelism (Rob pike)

    Rob pike发表过一个有名的演讲<Concurrency is not parallelism>(https://blog.golang.org/concurrency-is-not- ...

  3. 深入理解计算机系统_3e 第八章家庭作业 CS:APP3e chapter 8 homework

    8.9 关于并行的定义我之前写过一篇文章,参考: 并发与并行的区别 The differences between Concurrency and Parallel +---------------- ...

  4. 8点了解Java服务端单元测试

    一. 前言 单元测试并不只是为了验证你当前所写的代码是否存在问题,更为重要的是它可以很大程度的保障日后因业务变更.修复Bug或重构等引起的代码变更而导致(或新增)的风险. 同时将单元测试提前到编写正式 ...

  5. concurrency parallel 并发 并行

    Computer Systems A Programmer's Perspective Second Edition The general phenomenon of multiple flows ...

  6. concurrency parallel 并发 并行 parallelism

    在传统的多道程序环境下,要使作业运行,必须为它创建一个或几个进程,并为之分配必要的资源.当进程运行结束时,立即撤销该进程,以便能及时回收该进程所占用的各类资源.进程控制的主要功能是为作业创建进程,撤销 ...

  7. Concurrency in csharp (Asynchronous, Parallel, and Multithreaded Programming)

    http://stephencleary.com/projects/ /// <summary> /// /// </summary> public partial class ...

  8. 并行【parallel】和并发【concurrency】线程是并发还是并行,进程是并发还是并行

    线程是并发,进程是并行:进程之间相互独立,是系统分配资源的最小单位,同一个线程中的所有线程共享资源. 并行,同一时刻多个任务同时在运行. 并发,在同一时间内隔内多个任务都在运行,但是都不会在同一时刻同 ...

  9. Concurrency != Parallelism

    前段时间在公司给大家分享GO语言的一些特性,然后讲到了并发概念,大家表示很迷茫,然后分享过程中我拿来了Rob Pike大神的Slides <Concurrency is not Parallel ...

随机推荐

  1. winform 的 checklistbox动态绑定并选中值

    绑定的代码:这里绑定的是一个泛型 BLL.PowerBLL powerbll = new BLL.PowerBLL(); checkpower.DataSource = powerbll.GetAll ...

  2. 添加可点击的imagebottom,有个点击动画效果

    android添加可点击的按钮,有个动画切换 ,首先定义一个 res/drawable中定义一个 btn_shutter_background.xml,其定义举例如下: <?xml versio ...

  3. nginx 日志参数说明

    $args #请求中的参数值 $query_string #同 $args $arg_NAME #GET请求中NAME的值 $is_args #如果请求中有参数,值为"?",否则为 ...

  4. Mongo同步数据到Elasticsearch

    个人博客:https://blog.sharedata.info/ 最近需要把数据从Mongo同步到Elasticsearch环境:centos6.5python2.7pipmongo-connect ...

  5. Native VLAN打上标记

    802.1Q和ISL都知道两者的区别在于前者对native vlan的流量不打标记,而后者统一都打标记. 配置成Native VLAN的Trunk端口,收到Native VLAN的帧后,不打标记直接从 ...

  6. Gcc手册(转)

    手册链接地址:http://www.shanghai.ws/gnu/gcc_1.htm GCC中文手册 GCC现在是GNU中最主要和最流行的c & c++编译器. gcc/g++在执行编译工作 ...

  7. 【BZOJ1923】[Sdoi2010]外星千足虫 高斯消元

    [BZOJ1923][Sdoi2010]外星千足虫 Description Input 第一行是两个正整数 N, M. 接下来 M行,按顺序给出 Charles 这M次使用“点足机”的统计结果.每行 ...

  8. 1503 猪和回文(DP)

    1503 猪和回文 题目来源: CodeForces 基准时间限制:2 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 一只猪走进了一个森林.很凑巧的是,这个森林的形状是长方形的,有 ...

  9. _utf8_encode _utf8_decode base64_encode base64_decode

    const Base64 = { // private property _keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv ...

  10. 【python】-- Django Form

    Django  Form Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容(自定义样式) 一.F ...