如何选择编程语言(4)并行 / 并发模型

如何选择编程语言(4)并行 / 并发模型
0

本系列的其他文章:
如何选择编程语言(1)执行方式
如何选择编程语言(2)内存管理
如何选择编程语言(3)强类型 VS 弱类型
如何选择编程语言(5)面向对象
如何选择编程语言(6)函数式编程
如何选择编程语言(7)对 null 的处理
如何选择编程语言(8)官方 API
如何选择编程语言(9)第三方库生态

首先要说明的是,并行和并发并不是一样的概念,它们的区别可以参考这个知乎问题。并行的一定是并发的,并发的不一定是并行的。

4.1. 多线程并行

汇编语言可以直接调用操作系统的 API 来实现多线程。

C / C++ 可以通过 pthread 库或者直接调用操作系统的 API 来实现多线程。

Java 可以调用 Java API 来实现多线程,C# / VB.net 则可以调用 .net 的 API 来实现多线程。

Python 也可以通过其官方 API 实现多线程。虽然最普遍使用的 Python 运行时 CPython 和 PyPy 目前由于全局解释器锁(GIL)的缘故使不同线程不能在多个 CPU 核心(core)中并行运行,但还是有某些 Python 运行时如 Jython 已去掉了 GIL。

JavaScript 在支持 worker API 的运行时程序上可以通过创建 worker 来实现多线程,但这些线程之间只能通过消息通讯,不能共享内存。

4.2. 用户态线程 / 协程并发

Python 可以通过生成器、asyncio 库或者 async / await 语法来使用协程(coroutine)。

Go 可以通过 goroutine 来使用协程。Gorotine 是可以并行的,可以充分利用多个 CPU 核心。

Kotlin 可以通过 kotlinx.coroutine 包提供的 API 来使用协程。

4.3. 非阻塞 IO API + 内置事件循环并发

JavaScript 运行时通过提供非阻塞的 IO API 以及内部实现事件循环的方式,使得 JavaScript 可以在等待 IO 返回数据的同时可以并发地运行其他处理逻辑。

4.4. 多进程并行

PHP 目前没有语言上的特性或者自带的 API 可以实现多线程或协程,要实现多线程需要额外安装 pthreads 拓展或者 Swoole 拓展。通常 PHP 的并发是通过多进程来实现的。

如果使用有 GIL 的 Python 运行时程序、Ruby 运行时程序或者不支持 worker API 的 JavaScript 运行时程序(例如版本 10 以前的 Node.js),如果想要充分利用多个 CPU 核心,也需要通过多进程来实现并行。