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

时间:2008-09-23 15:19:46

标签: programming-languages concurrency functional-programming multicore

CPU架构格局发生了变化,多核心趋势将改变我们开发软件的方式。我已经完成了C,C ++和Java的多线程开发,我使用各种IPC机制完成了多进程开发。对于开发人员来说,使用线程的传统方法似乎并不容易使用支持高度并发性的硬件。

您了解哪些语言,库和开发技术有助于缓解创建并发应用程序的传统挑战?我显然在考虑死锁和竞争条件等问题。设计技术,库,工具等也很有意义,它们有助于实际利用并确保利用可用资源 - 只需编写一个安全,强大的线程应用程序并不能确保它使用所有可用的内核。 p>

到目前为止我看到的是:

  • Erlang:基于流程,消息传递IPC,'actor的并发模型
  • Dramatis:适用于Ruby和Python的actor模型库
  • Scala:JVM的函数式编程语言,增加了一些并发支持
  • Clojure:具有actor库的JVM的函数式编程语言
  • Termite:Erlang的流程方法和传递给Scheme
  • 的消息的端口

你还知道什么,对你有用的东西以及你认为有什么值得关注的东西?

15 个答案:

答案 0 :(得分:11)

我建议两种范式转变:

软件事务内存

您可能需要查看软件事务内存(STM)的概念。我们的想法是使用乐观并发:任何与其他操作并行运行的操作都会尝试在隔离的事务中完成其工作;如果在某个时刻已经提交了另一个事务,该事务使该事务正在工作的数据无效,则事务的工作将被丢弃并且事务再次运行。

我认为第一个广为人知的想法实现(如果不是概念验证和第一个)是Haskell中的那个:Papers and presentations about transactional memory in HaskellWikipedia's STM article上列出了许多其他实现。

事件循环和承诺

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

请注意,它处理并发的方式以及语言设计的其他部分主要基于Actor模型。

答案 1 :(得分:9)

你提到过Java,但你只提到了线程。你看过Java的并发库了吗?它与Java 5及更高版本捆绑在一起。

这是一个包含ThreadPools的非常好的库,CopyOnWriteCollections只列举了一些。查看Java Tutorial上的文档。或者,如果您愿意,the Java docs

答案 2 :(得分:7)

答案 3 :(得分:6)

我已经将processing用于Python。它模仿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)。

答案 4 :(得分:4)

英特尔用于C ++的Threading Building Blocks对我来说非常有趣。它提供了比原始线程更高级别的抽象。如果您喜欢死树文档,O'Reilly有一个非常nice book。另见Any experiences with Intel’s Threading Building Blocks?

答案 5 :(得分:4)

我会说:

模型:线程+共享状态,actor +消息传递,事务内存,map / reduce? 语言:Erlang,Io,Scala,Clojure,Reia 图书馆:Retlang,Jetlang,Kilim,Cilk ++,fork / join,MPI,Kamaelia,Terracotta

我维护一个关于这样的东西的并发链接博客(Erlang,Scala,Java线程,演员模型等)并且每天建立一些链接:

http://concurrency.tumblr.com

答案 6 :(得分:4)

问题What parallel programming model do you recommend today to take advantage of the manycore processors of tomorrow?已被提出。我也在那里给出了以下答案。

Kamaelia是一个 python框架,用于构建具有大量通信进程的应用程序。

  

Kamaelia - 并发变得有用,有趣

     

在Kamaelia中,您可以使用相互通信的简单组件构建系统。这加速了开发,大规模地帮助维护,也意味着您构建自然并发的软件。它可以由任何开发人员访问,包括新手。它也很有趣:)

     

什么样的系统?网络服务器,客户端,桌面应用程序,基于游戏的游戏,转码系统和管道,数字电视系统,垃圾邮件根除者,教学工具以及更多的数据:)

这是来自Pycon 2009的视频。它首先将Kamaelia与Twisted和Parallel Python进行比较,然后展示Kamaelia。

Easy Concurrency with Kamaelia - Part 1(59:08)
Easy Concurrency with Kamaelia - Part 2(18:15)

答案 7 :(得分:4)

我已经在Ada进行了近20年的并发编程。

语言本身(不是在库上添加的一些)支持线程(“任务”),多个调度模型和多个同步范例。您甚至可以使用内置基元构建自己的同步方案。

您可以将Ada的rendezvous视为一种面向过程的同步工具,而protected objects则更加面向对象。 Rendezvous类似于monitors的旧CS概念,但功能更强大。受保护对象是具有同步原语的特殊类型,允许您构建与操作系统锁,信号量,事件等完全相同的东西。但是,它足够强大,您还可以创建和创建自己的同步对象,具体取决于您的确切需求

答案 8 :(得分:3)

答案 9 :(得分:2)

我知道Reia - 一种基于Erlang但看起来更像Python / Ruby的语言。

答案 10 :(得分:2)

答案 11 :(得分:2)

答案 12 :(得分:2)

OpenMP

它为您处理线程,因此您只需要担心要并行运行C ++应用程序的哪些部分。

例如

#pragma omp parallel for
for (int i=0; i < SIZE; i++) 
{
// do something with an element
}

上面的代码将在你告诉openmp运行时使用的多个线程上运行for循环,所以如果SIZE为100,并且你有一个四核盒子,那个for循环将在每个上运行25个项目芯

还有一些针对各种语言的其他并行扩展,但我最感兴趣的是那些在你的显卡上运行的扩展。这是真正的并行处理:)(示例:GPU++libSh

答案 13 :(得分:2)

C ++ 0x将提供std::lock函数来锁定多个互斥锁。这将有助于缓解由于无序锁定导致的死锁。此外,C ++ 0x线程库将具有promise,future和打包任务,这允许线程在没有任何用户级锁定的情况下等待在另一个线程上执行的操作的结果。

答案 14 :(得分:0)

multiprocessing是一个python库,它简化了多核编程,如另一个答案中所提到的。

使用python的multiprocessing编写的程序可以轻松修改,以便在云上运行工作,而不是本地核心。 piCloud利用这一点在云上提供大量按需处理能力:您只需要修改2行代码。

所以,这就是外卖:在为多核选择库时,人们可能想问一下云方法是否也有意义。