并发这个概念一直都有,范围很光,主机级别的分布式,集群,操作系统级别的进程,线程,纤程,一直到语言级别的函数式编程,协程有些是在操作系统级别实现,有些是在语言级别实现,算是跨了两个级别。
无论 map-reduce大热,函数式语言大热,greenevent,erlang的process,scala的actor、stm,C++的TBB、cilk++,都是在不同的级别追求并发,都意味着把任务切割成不同层次的大小, 把任务分成可并发执行的子任务。
有这么多选择,并发似乎是件轻而易举的事情了。然而,事情却并非如此。
任务无论怎样切割和并发,总是需要同步和协调,否则就构不成一个完整的任务了。 这个同步和协调点,成为关键点,很容易成为并发的瓶颈。
传统的过程式语言,无论使用线程、协程还是STM,在编程的时候都要考虑同步和协调,对编程的技能要求高,也增加了编程的负担。
函数式语言可以在语句层面做并发执行,不需要额外的努力,就可以利用CPU的多核优势,是最理想不过了。虽然由大任务直接分解成语句级别的小任务,这个工作并不轻松,但是在编程的时候就不需要考虑在哪里同步和协调,符合一次解决一个问题的思维模式。