35

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

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

到目前为止我看到的是:

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

你还知道什么,什么对你有用,你认为什么有趣?

4

15 回答 15

11

我建议进行两个范式转变:

软件事务内存

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

我认为这个想法的第一个广为人知的实现(如果不是概念验证和第一个)是 Haskell 中的一个:关于 Haskell 中事务内存的论文和演示Wikipedia 的 STM 文章中列出了许多其他实现。

事件循环和承诺

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

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

于 2008-09-24T15:18:36.820 回答
9

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

这是一个非常好的库,包含 ThreadPools、CopyOnWriteCollections 等等。查看Java 教程中的文档。或者,如果您愿意,可以使用 Java 文档

于 2008-09-23T15:25:26.890 回答
6

我已经使用Python处理它模仿线程模块的 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)。

于 2008-09-23T15:32:28.637 回答
4

英特尔的C++线程构建块对我来说非常有趣。它提供了比原始线程更高级别的抽象。如果您喜欢死树文档,O'Reilly 有一本非常好的书。另请参阅英特尔线程构建模块的任何经验?.

于 2008-09-23T15:36:40.233 回答
4

我会说:

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

我维护了一个关于此类内容(Erlang、Scala、Java 线程、actor 模型等)的并发链接博客,并且每天发布几个链接:

http://concurrency.tumblr.com

于 2008-09-23T20:23:13.820 回答
4

问题您今天推荐什么并行编程模型来利用明天的众核处理器?已经被问过了。我也在那里给出了以下答案。

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

Kamaelia - 并发变得有用、有趣

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

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

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

使用 Kamaelia 轻松并发 - 第 1 部分(59:08)
使用 Kamaelia 轻松并发 - 第 2 部分(18:15)

于 2008-09-25T23:38:14.347 回答
4

近 20 年来,我一直在 Ada 中进行并发编程。

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

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

于 2009-04-28T16:55:38.340 回答
3

我正在密切关注.NETParallel LINQ的 Parallel Extensions 。

于 2008-09-23T15:32:02.520 回答
2

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

于 2008-09-23T15:27:43.233 回答
2

这个问题与您今天推荐哪种并行编程模型以利用明天的众核处理器密切相关,如果不是重复的话?

于 2008-09-23T15:37:10.713 回答
2

Java 也有你知道的演员库。你知道Java 是一种函数式语言吗?;)

于 2008-09-27T05:09:55.093 回答
2

开放MP

它为您处理线程,因此您只需担心要并行运行的 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

于 2008-10-20T16:24:39.537 回答
2

C++0x 将提供std::lock将多个互斥锁锁定在一起的函数。这将有助于缓解由于乱序锁定导致的死锁。此外,C++0x 线程库将包含 promise、futures 和打包任务,它们允许线程等待在另一个线程上执行的操作的结果,而无需任何用户级锁。

于 2008-10-21T14:07:54.960 回答
0

multiprocessing是一个简化多核编程的python库,正如另一个答案中提到的那样。

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

所以,这里是要点:在为多核选择库时,人们可能想问云方法是否也有意义。

于 2012-06-06T14:01:26.150 回答