如何开始进行严肃的并发(多线程、并行?)编程

4

我希望能够在实际工作中开始多线程/并行/并发编程。我的意思是尝试以并行和并发的方式解决实际问题,而不仅仅是学习有关pthreadMPI、锁定、竞争等低级细节或者学术、教科书的例子。关于并行编程的底层机制,事实上我宁愿不知道任何关于它们的东西,只想坚持更像Actor模型的东西 :)

我听说有些编程语言天生就像我所寻找的那样,它们的范式是以并行(并发、多线程、多进程)的方式看待手头的问题,并提供语言级别的工具和构造来实现任务的并行执行(例如Erlang有一个名为process的语言结构?)。

我喜欢像Scala一样拥有类型系统的语言……虽然我非常熟悉PHP并且曾经在C/C++中编写了大量代码。我对Scala和Java有一定的了解,可以阅读Haskell但并不精通。我非常熟悉函数式范式,并且愿意学习更多。我也对高水平的关于并行性/并发性的理论讨论感兴趣。


Node.js会帮助你...希望能对你有所帮助。 - backtrack
1
解决现实世界的问题,如果不理解高级构造所建立的现实世界基元,通常会导致不专业的解决方案。如果你急于部署某些东西,那么可以这样做。否则,如果你只把锤子放在工具箱里,所有的问题看起来都像钉子。 - Rex Kerr
@RexKerr 我的理解是,一个人可以在不深入了解Actor模型在某个平台上的实现细节的情况下,很好地使用Actor模型。有点像学习Java而不是字节码。但如果我错了,请务必纠正我。 - Ashkan Kh. Nazary
2
@ashy_32bit - 你为什么要并行处理呢?是为了快速处理吗?你手头有数千个处理器吗?如果不是针对 SMP 配置,那也许不需要。如果没有,你需要了解各种消息传递的开销,否则性能将会很差。如果你没有数千个处理器,基于 CAS 的解决方案对某些操作可能比 Akka actors 快两个数量级。如果你只想让它“运行”,可以忽略细节。但如果你想让它“快速运行”,最好注意这些问题。 - Rex Kerr
1
@ashy_32bit - 我应该补充说明,这也适用于Erlang:你可以通过相同的框架查看大多数内容,但你需要了解模型处理得好和不好的方面以及可以期望的性能水平。在某些情况下,Erlang可以很好地利用你的硬件。在其他情况下,你最好使用单线程的Java。 - Rex Kerr
显示剩余4条评论
1个回答

2
首先我想提到的是并行 != 并发。它们是密切相关的概念,但是“并行计算”与“并发计算”不同,因为“并行流控制”同时发生,而“并发流控制”可能交错,但也可能是并行的。这是一个微小的差别,但理解它非常重要。
“...提供语言级别的工具和结构来实现并行任务(例如Erlang有一个进程作为语言结构的概念?)。”
Erlang的“process”是一个轻量级、内存隔离的绿色线程。该语言没有共享内存结构;数据通过“消息”在并发的流控制之间传递。请注意,“并发”。 Erlang明确设计为一种并发语言,并且恰好会在某些流控制上进行调度——这些流控制映射到1:1的进程——并行执行。 Erlang不会给您关于调度的明确控制,这与线程模型不同。
很难知道您正在寻找什么——您的问题相当广泛——但是您提到的任何一种语言(除了PHP?)都将允许您利用肯定坐落在您的计算机中的多个CPU。选择几个重点进行学习,预计需要花费数年时间,然后开始吧。

我认为我需要一种编程语言来教我如何并行/同时思考,并提供编写这些想法的工具,而不是一种教授我实现该范例所使用的机制细节的语言。 - Ashkan Kh. Nazary
1
那么,Erlang 就是你需要的...兄弟。 - Muzaaya Joshua

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接