异步编程模型的说明

前几日在看到Alexander Temerev在github上创建了一个项目skynet,用来比较各语言的并发编程的性能,当时觉得这个项目挺有趣,也就翻译整理了一下,写了一篇文章:1百万线程的性能,并且分享在开发者头条上。

本身这个项目涉及的语言很多,测试代码也不一定完全合理,因此这个项目的issue中也有很多讨论,也有很多贡献者提供了其它语言的测试代码,或者完善了现有的测试代码。

很多读者也对这个项目感兴趣,也在我的文章中留言表达了自己的观点,我很赞赏这些有意义的观点。

这个项目的描述是"Skynet 1M threads microbenchmark",我也采用了这样的描述作为文章的标题。当然大家都知道这个项目比较的并不是1百万线程的性能,
而是各个语言中为并发编程实现的类似线程的编程模型,这个各个语言为并发编程而做的努力。

当然,每个编程语言实现的并发编程模型也不尽相同,我们没办法用一个统一的概念称呼它们,姑且叫做"线程”吧。

各种语言的编程模型从内存实现上可以分为两类:

  1. 基于共享内存的模型:采用单一的统一的内存镜像,并发单元通过共享内存进行通讯,比如Java中的线程
  2. 基于消息传递的模型:每个并发单元包含自有的内存,并发单元通过消息交换进行通讯,比如go channel,Scala Actor等

从实现上来说,至少有三种模型实现:

  1. 基于线程的实现: 大部分的操作系统(轻量级的进程、内核级、用户级)、Java、C、C++都是这种实现
  2. 基于Actor的实现:Scala, Erlang等
  3. 基于Coroutine的实现:Haskell, Python等

当然,有些语言也不止一种实现,比如Python还有Pykka,它是一种actor的实现。 Java也可以使用Akka Actor实现Actor模型,比如Go实现了goroutine和CSP模型(channel)。

Paul Butcher写了一本书,叫七周七并发模型, 对并发编程想了解的不妨看看。

参考文档:

  1. https://en.wikipedia.org/wiki/Light-weight_process
  2. https://en.wikipedia.org/wiki/Coroutine
  3. https://en.wikipedia.org/wiki/Green_threads
  4. http://tutorials.jenkov.com/java-concurrency/concurrency-models.html
  5. https://en.wikipedia.org/wiki/Concurrency_%28computer_science%29#Models
  6. https://en.wikipedia.org/wiki/Communicating_sequential_processes
  7. http://www.amazon.com/Seven-Concurrency-Models-Weeks-Programmers/dp/1937785653
  8. http://berb.github.io/diploma-thesis/original/056_other.html
  9. http://grid.cs.gsu.edu/~tcpp/curriculum/sites/default/files/Programming%20with%20Concurrency%20-%20Threads%20Actors%20and%20Coroutines.pptx