多核和并发-语言、库和开发技术

35
CPU架构已经发生了变化,多核心是一种趋势,将改变我们开发软件的方式。我在C、C++和Java中进行了多线程开发,我使用了各种IPC机制进行了多进程开发。传统的线程使用方法似乎并不容易让开发人员利用支持高并发度的硬件。
您知道哪些语言、库和开发技术可以帮助缓解创建并发应用程序的传统挑战?我显然在考虑像死锁和竞态条件这样的问题。设计技术、库、工具等也很有趣,可以帮助实际利用和确保可用资源被利用 - 只编写一个安全、强大的线程应用程序并不能确保它使用所有可用的核心。
我所看到的是:
  • Erlang:基于进程,消息传递IPC,"actor"并发模型
  • Dramatis:Ruby和Python的actors模型库
  • Scala:JVM的函数式编程语言,具有一定的并发支持
  • Clojure:JVM的函数式编程语言,带有actors库
  • Termite:将Erlang的进程方法和消息传递移植到Scheme
您还知道什么,对您有用的是什么,您认为值得关注的是什么?

3
你混淆了并发和并行。 - J D
2
我认为说Clojure有一个“actors library”有些不准确 - 实际上整个语言都是围绕并发性和不可变性设计的。值得一看的是http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey,以了解更多哲学思想。 - mikera
+1 mikera....Clojure 支持代理 (agents),而不是演员 (actors)。使用演员模型,您会向实体发送数据,以告诉该实体改变一些其他数据。使用代理模型,您会向实体发送函数来改变该实体的状态。 - Timothy Baldridge
15个回答

11

我建议两种范式转变:

软件事务内存

您可能想了解一下软件事务内存(STM)的概念。其思想是使用乐观并发:运行在并行状态下的任何操作都会尝试在隔离的事务中完成其工作;如果另一个事务在某个时刻已提交,且无效ates此事务正在处理的数据,则该事务的工作将被放弃,并重新运行该事务。

我认为第一个广为人知的实现(如果不算概念验证和第一个实现),是Haskell中的一个实现:有关Haskell中事务内存的论文和演示文稿。许多其他实现都列在Wikipedia的STM文章中。

事件循环和Promise

另一种处理并发的非常不同的方式是在[E编程语言] (http://en.wikipedia.org/wiki/E_(programming_language%29))中实现的。

请注意,它处理并发的方式以及语言设计的其他部分,都严重依赖于Actor模型。


9
您提到了Java,但只提到了线程。您是否看过Java的并发库?它与Java 5及以上版本一起捆绑使用。
这是一个非常好的库,包含ThreadPools、CopyOnWriteCollections等。请查看Java教程中的文档。或者,如果您愿意,可以查看Java文档


6
我曾经使用过Python的processing。它模仿了threading模块的API,因此非常容易使用。
如果你使用了map/imap或生成器/列表推导式,将你的代码转换为使用processing是很简单的:
def do_something(x):
    return x**(x*x)

results = [do_something(n) for n in range(10000)]

可以与并行处理一起使用

import processing
pool = processing.Pool(processing.cpuCount())
results = pool.map(do_something, range(10000))

这个程序会使用所有可用的处理器来计算结果。还有一些懒惰的(Pool.imap)和异步的变体(Pool.map_async)。

有一个队列类,它实现了Queue.Queue,以及类似于线程的工作进程。

注意事项

processing基于fork(),在Windows上必须模拟。对象通过pickle/unpickle传输,因此您必须确保其正常工作。已经获取资源的进程进行分叉可能不是您想要的(考虑数据库连接),但总体上它可以正常工作。它的表现非常出色,以至于它已经被添加到Python 2.6的快速通道中(参见PEP-317)。


谢谢,这很有帮助——听起来这些想法可以与Dramatis分享。 - Kyle Burton
也可以提一下它的后代——2.6的multiprocessing模块。 - Constantin

4

4
"I would say:"
“模型:线程+共享状态、Actor+消息传递、事务内存、Map/Reduce?
语言:Erlang、Io、Scala、Clojure、Reia
库:Retlang、Jetlang、Kilim、Cilk++、fork/join、MPI、Kamaelia、Terracotta”
“I maintain a concurrency link blog about stuff like this (Erlang, Scala, Java threading, actor model, etc) and put up a couple links a day:”
“我维护一个关于并发(Erlang、Scala、Java线程、Actor模型等)的链接博客,并每天发布几个链接:
http://concurrency.tumblr.com

1
需要注意的是,Kamaelia在多核支持方面还不够完善。可以说它仍处于非常实验性的阶段。 - Jason Baker

4
这个问题已经被问过了:What parallel programming model do you recommend today to take advantage of the manycore processors of tomorrow? 我也在那里给出了以下答案。 Kamaelia 是一个用于构建大量通信进程应用程序的Python框架
在Kamaelia中,您可以从相互通信的简单组件构建系统。这加速了开发,极大地帮助了维护,并且还意味着您可以构建自然并发的软件。它旨在让任何开发人员,包括新手,都能轻松使用。而且它还很有趣:)
可以构建哪些系统?网络服务器、客户端、桌面应用程序、基于pygame的游戏、转码系统和管道、数字电视系统、垃圾邮件清除器、教学工具等等。 使用Kamaelia轻松实现并发 - 第1部分(59:08)
使用Kamaelia轻松实现并发 - 第2部分(18:15)

4

我已经使用Ada进行并发编程将近20年了。

这种语言本身(不是一些附加的库)支持线程(“任务”),多种调度模型和多种同步范例。你甚至可以使用内置原语构建自己的同步方案。

你可以把Ada的约会看作一种面向过程的同步工具,而受保护对象则更加面向对象。约会类似于旧的CS概念监视器,但更加强大。受保护对象是具有同步原语的特殊类型,允许您构建像操作系统锁、信号量、事件等完全相同的东西。但是它足够强大,以至于您还可以根据实际需求发明和创建自己的同步对象。


3
我知道Reia这种语言,它基于Erlang,但看起来更像Python/Ruby。

3

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