Go 发关于理解并发和并行的 Keynote

sunfmin · 2012年11月30日 · 最后由 debugger 回复于 2013年08月08日 · 6419 次阅读

得到了意想不到的广告效果。。。谁想玩两下 Qortex 的话,我来建立个 Org,然后加大家进来。

回复留 Email 地址,我就给你加进来,现在加了 2 个

折服,这么通俗易懂的 PPT,太有喜感了!

3 楼 已删除

我有删除回复的权限,所以留下 email 的同学,我会发出邀请,然后就把你们的 mail 删除掉,以防爬虫。

5 楼 已删除

ppt 很妙!借用一下在培训中,是否介意?

怎么跟我理解的刚好相反= = -> 并发是利用分时系统的时间切片来实现无序计算的并行假象,而并行是在多核上同时计算。所以很多时候 SMP 和并行会同时出现。 之前翻译过一点 erlang in action,里面序章也有说过,我去找找看。

回头又看了一下,好像看走眼了,sorry...你是对的...被最后那句并发大于并行这句话搞糊涂了

我说的和你说的差不多吧?那多核上的并发呢?

下面这样翻译对吧,光看汉语有时候很含糊。 并发:Concurrency 并行:Parallelism

#11 楼 @sunfmin 是这样翻译。你是对的,第一次看 PPT 被最后那句并发大于并行搞糊涂了

#11 楼 @sunfmin Go 的 channel 是 reliable 的?

哦。。我想说并发的概念包含并行,并发中的元素可以有并行,也可以无并行。。 就是单核上面执行并发的程序,也是有可能提高效率的,比如某些 Goroutine 在等 IO,这是其他 Goroutine 就可以占用闲下来的 CPU,运行不同的事情。

#14 楼 @sunfmin

就是单核上面执行并发的程序,也是有可能提高效率的,比如某些 Goroutine 在等 IO,这是其他 Goroutine 就可以占用闲下来的 CPU,运行不同的事情。

这个是并行吧 ...

我觉得就一个目标其实,增加吞吐量,把 CPU 搞到 100%,尽量发挥一台机器的最大能力。

#14 楼 @sunfmin 并发严格意义上来说不会提高效率的,反而会降低。那个的确是并发,解决了 io 阻塞

#15 楼 @bhuztez 我怎么感觉你反了,真正实现并行 Parallelism,就是多核,或多台服务器。。

#18 楼 @sunfmin 同时处理几件事就是并行吧,管它是真的并行,还是冒充的

并发是说,同时处理的事,他们的状态是相互影响的

把同一个任务跑两个就是并行

把一个任务拆成几个相对简单,但相互关联的任务叫并发

#17 楼 @saiga 就是因为几乎所有的系统都有 IO 掺杂在里面,和各种等待,所以实际上是提高了效率的。

#20 楼 @sunfmin 嗯,微观上降低了,宏观上提高了。

#19 楼 @bhuztez 其实我的 keynote 要说的,就是你这个帖子里说的 http://ruby-china.org/topics/6419

一堆任务一起跑,那叫并行,它们之间有交互才叫并发...

#22 楼 @sunfmin 但是你的例子里没有交互啊

实际的问题肯定会有并行任务直接的交互或者依赖的,所以 Go 提供了抽象实现这种交互的两个工具,Goroutine 和 Channel

#24 楼 @sunfmin 所以我问你 Channel 是不是 reliable 的

#23 楼 @bhuztez 我这个东西就在说交互吧?烧开水并发任务依赖洗水壶的完成才能开始,这就是交互吧?那你说的交互具体是啥?

#25 楼 @bhuztez Channel 不 Reliable 在哪里啊?我目前为止就只管用了,没想别的呢。

#16 楼 @sunfmin 这个不是目标。目标是把一个复杂的任务分解成多个比较容易理解的部分

#27 楼 @sunfmin 没说不 reliable 啊,我怀疑 go 的 channel 是假定 reliable 的

#28 楼 @bhuztez 我也严重同你这个说法,复杂任务分解成简单任务,然后把其中相互独立的并行掉,有依赖的摆好顺序,这样就能实现最高效率的工作。

#16 楼 @sunfmin 补充一下,还有公平分配计算能力的问题,否则即使占满 CPU,可能反而导致系统不可用

哦,@bhuztez 说的 Reliable 就是怀疑他不会公平分配对吧?那我理解,你就假定他会公平分配吧,或者公平分配是他的目标,目前的实现我觉得也还好吧,其实可以测试出来,就是建 N 个 Goroutine 都在吃 CPU,然后看看,有没有 Goroutine 一直没执行到吧

#33 楼 @sunfmin 不是。reliable 的问题是,扩展到多台的时候会比较麻烦。请问你如何和另外一台机器上的 goroutine 建立 channel?

#34 楼 @bhuztez 嗯,目前 Go 还不能象 Erlang 那样,向其他机器上用 Channel 传值过去,但是他们(Go Team)好像将来会出来个什么东西来解决这个。以前有个 netchannel 来着,但是后来删掉了。估计是没实现好,或者有各种问题。

process 是并行/并发工具。

thread 也是并行/并行工具,但是有解释器锁的存在,在 ruby 里并行效果不好。

fiber 不是并行工具,因为其实还是只用一个核,但也由于只用一个核,没有线程同步的问题,不需要完全拷贝栈,因此可以快速大量创建,是并发工具。

CUDA, OpenCL 是利用 GPU 的并行工具,非并发工具。由于一些 GPU 有上千个核,并行处理能力比一般 CPU 强很多很多。GPU 运算有相应的 API (CUDA) 和封装 (OpenCL), 不受解释器锁的影响。

宙哥说的有理

#33 楼 @sunfmin 我和 B 大说的不是一回事,公平分配的问题看场景,大量小任务的场景会天然把计算打散,但是有些时候没这个前提,所以 erlang 会抢占式,当然还有 N+1 的问题

#36 楼 @luikore 宙哥什么时候来 The Plant 讲怎么开发编辑器~~

#39 楼 @sunfmin 写好宣传网站再说...

#40 楼 @luikore 我请安哥发条消息给全员,凡是 The Plant 的人,必须使用宙哥的编辑器

#40 楼 @luikore 现在哪里能下载?

#40 楼 @luikore 👍 很期待你的编辑器 :>

#42 楼 @sunfmin 还没弄好... 应该可以比 light table 先做出来...

很有意思丫。

对并发和并行的了解又多了一些

书上书 "并行是简单的重复,并发可以是顺序的,在对称多核处理器上才同时执行",这话对么?

需要 登录 后方可回复, 如果你还没有账号请 注册新账号