文档章节

Go 中的并发和并行

兔之
 兔之
发布于 2017/08/11 13:21
字数 357
阅读 14
收藏 0

并行是指同一时间做多件事情,并发是指同一时间具有做多件事情的能力。在很多情况下,并发的效果比并行好,因为操作系统的硬件资源和总资源是很少而且固定的,不能无限去扩张。Go 语言设计的时候应该也是推崇这种使用较少资源做更多事情的哲学。

并发执行

Go 语言中可以使用系统功能设置可以使用的物理处理器(核),如果设置为 1 的话,所有的协程会在一个核上运行。

package main 

import (
	"fmt"
	"runtime"
	"sync"
	)

var wg sync.WaitGroup

func printPrime(prefix string) {
	defer wg.Done()

next:
	for outer := 2; outer < 5000; outer++ {
		for inner := 2; inner < outer; inner++ {
			if outer % inner == 0 {
				continue next
			}
		}
		fmt.Printf("%s:%d\n", prefix, outer)
	}
	fmt.Printf("Completed", prefix)
}

func main() {
	runtime.GOMAXPROCS(1)
	wg.Add(2)
	fmt.Println("Create Goroutines")
	go printPrime("A")
	go printPrime("B")

	fmt.Println("Waiting to Finish")
	wg.Wait()

	fmt.Println("Terminating program")
}

结果打印

A:4513
A:4517
A:4519
A:4523
A:4547
B:3739
B:3761
...
B:4951
B:4957
B:4967
B:4969
B:4973
B:4987
B:4993
B:4999
Completed%!(EXTRA string=B)A:4549
A:4561
A:4567
A:4583
A:4591
A:4597
A:4603
A:4621
A:4637

也就是两个协程交替执行。

并行执行

更改 runtime.GOMAXPROCS(1)runtime.GOMAXPROCS(runtime.NumCPU()) 后,会使用硬件的多核,并行执行。

结果打印

B:4943
A:4951
B:4951
A:4957
B:4957
A:4967
B:4967
A:4969
B:4969
A:4973
A:4987
B:4973
B:4987
A:4993
B:4993
A:4999

© 著作权归作者所有

兔之
粉丝 69
博文 250
码字总数 96477
作品 7
深圳
程序员
私信 提问
Java并发编程之概念一:并行与并发

Java并发编程之概念一:并行与并发 概念解释 并行性和并发性是既相似又有区别的两个概念。 并行性是指两个或多个事件在同一时刻发生。 而并发性是指连个或多个事件在同一时间间隔内发生。在多...

优惠券活动
03/23
0
0
6、Java并发性和多线程-并发性与并行性

以下内容转自http://tutorials.jenkov.com/java-concurrency/concurrency-vs-parallelism.html(使用谷歌翻译): 术语并发和并行性通常用于多线程程序。但是,并发和并行性究竟是什么意思呢...

easonjim
2017/06/16
0
0
并行、并发、同步和互斥

并行 计算机操作系统中的并行,指的是同时存在于内存中的多道作业都处于运行状态。实际上都是宏观上并行,微观上串行,因为这些作业都是开始各自的运行,但都没运行完毕,只是交替地使用cpu...

动态灵犀
2015/10/22
200
0
《C#并发编程经典实例》读书笔记-关于并发编程的几个误解

误解一:并发就是多线程 实际上多线程只是并发编程的一种形式,在C#中还有很多更实用、更方便的并发编程技术,包括异步编程、并行编程、TPL 数据流、响应式编程等。 误解二:只有大型服务器程...

repeatedly
2018/07/29
0
0
并发编程模型

原文链接 作者: Jakob Jenkov 译者: 林威建 [weakielin@gmail.com] 并发系统可以采用多种并发编程模型来实现。并发模型指定了系统中的线程如何通过协作来完成分配给它们的作业。不同的并发模...

暗之幻影
2016/12/17
35
0

没有更多内容

加载失败,请刷新页面

加载更多

Mybatis Plus删除

/** @author beth @data 2019-10-17 00:30 */ @RunWith(SpringRunner.class) @SpringBootTest public class DeleteTest { @Autowired private UserInfoMapper userInfoMapper; /** 根据id删除......

一个yuanbeth
今天
4
0
总结

一、设计模式 简单工厂:一个简单而且比较杂的工厂,可以创建任何对象给你 复杂工厂:先创建一种基础类型的工厂接口,然后各自集成实现这个接口,但是每个工厂都是这个基础类的扩展分类,spr...

BobwithB
今天
5
0
java内存模型

前言 Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模...

ls_cherish
今天
4
0
友元函数强制转换

友元函数强制转换 p522

天王盖地虎626
昨天
5
0
js中实现页面跳转(返回前一页、后一页)

本文转载于:专业的前端网站➸js中实现页面跳转(返回前一页、后一页) 一:JS 重载页面,本地刷新,返回上一页 复制代码代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a h...

前端老手
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部