多核和并发 – 语言,图书馆和开发技术

CPU架构的格局已经改变,多核心是一个趋势,将改变我们如何开发软件。 我在C,C ++和Java中完成了multithreading开发,我使用各种IPC机制完成了多进程开发。 使用线程的传统方法似乎并不使开发人员容易使用支持高度并发性的硬件。

您意识到哪些语言,库和开发技术有助于缓解创build并发应用程序的传统挑战? 我显然正在考虑像僵局和竞赛状况这样的问题。 devise技术,库,工具等也是有趣的,有助于实际利用并确保可用资源得到利用 – 只要编写一个安全,可靠的线程化应用程序并不能确保它使用所有可用的内核。

我目前看到的是:

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

你还知道什么,为你工作了什么,你觉得有什么好看的?

我会build议两种模式转变:

软件事务内存

您可能想要看看软件事务内存 (STM)的概念。 这个想法是使用乐观并发 :与他人并行运行的任何操作都尝试在单独的事务中完成其工作; 如果在某个时候另一个事务被提交,使得这个事务处理的数据无效,那么事务的工作就会被抛弃,事务再次运行。

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

事件循环和承诺

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

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

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

这是一个非常好的库,包含ThreadPools,CopyOnWriteCollections等等。 请参阅Java教程中的文档。 或者,如果您愿意, Java文档 。

一些基于Scala的东西:

  • PiLib:Pi演算风格并发的托pipe语言
  • 没有控制反转的基于事件的编程
  • 统一线程和事件的参与者
  • 斯卡拉多播演员:架构和实施
  • 使用可扩展模式匹配实现联接
  • 沟通Scala对象(修订)

我使用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 )和asynchronous变体( Pool.map_async )。

有一个实现Queue.Queue的队列类,和类似于线程的工作者。

陷阱

processing基于fork() ,它必须在Windows上模拟。 对象通过pickle / unpickle传输,所以你必须确保这个工作。 已经获得资源的进程分叉已经可能不是你想要的(想想数据库连接),但通常它是有效的。 它工作得很好,以至于它已经被添加到了Python 2.6的快车道上(参见PEP-317 )。

英特尔的C ++ 线程构build模块对我来说非常有趣。 它提供了比原始线程更高的抽象层次。 O'Reilly有一本非常好的书,如果你喜欢死树的文档。 还请参阅英特尔线程构build模块的使用经验吗? 。

我会说:

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

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

http://concurrency.tumblr.com

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

Kamaelia是一个用于构build具有大量通信进程的应用程序的Python框架

Kamaelia Kamaelia – 并发变得有用,有趣

在Kamaelia中,您可以从简单的组件构build系统,这些组件可以相互交stream 。 这加速了开发,大量的帮助维护,也意味着你build立自然并发的软件 。 它的目的是任何开发人员,包括新手访问。 这也使它很有趣:)

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

下面是来自Pycon 2009的一段video。首先将Kamaelia与Twisted和Parallel Python进行比较,然后演示Kamaelia。

简单的并发与Kamaelia – 第1部分 (59:08)
与Kamaelia轻松并发 – 第二部分 (18:15)

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

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

你可以把Ada的集合点看作一种面向过程的同步工具,而受保护的对象则更加面向对象。 Rendezvous类似于旧的CS- 监视器概念,但function更强大。 受保护的对象是具有同步原语的特殊types,它允许您完全像OS锁,信号量,事件等一样构build事物。但是,它足够强大,您可以根据自己的确切需求创build和创build自己的同步对象。

我正在密切关注Parallel Extensions for .NET和并行LINQ 。

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

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

Java也有一个演员库,你也知道 。 你知道J ava是一种function性语言吗? ;)

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 )

C ++ 0x将提供std::lock函数来locking多个互斥锁在一起。 这将有助于缓解由于无序locking造成的死锁。 此外,C ++ 0x线程库将有承诺,期货和打包的任务,这些任务允许线程等待在另一个线程上执行的操作的结果,而不用任何用户级别的锁。

我开始与.Net并行扩展。 然而,这是一个CTP,每个新的激酶都在变化。 现在,我正在使用C#与ThreadPool,BackgroundWorker和线程实例。 我在一个中等规模的应用程序中logging了一些关键的过程。 我不知道从哪里开始。 但是,我购买了“C#2008和2005线程编程”的电子书版本,由Gaston C. Hillar – Packt Publishing – http://www.packtpub.com/beginners-guide-for-C-sharp- 2008年和2005年的线程编程/书籍 ,7天前。 我从出版商手中购买了这本电子书,但是现在这本书可以在Amazon.com上find。 强烈build议用于C#程序员。 我下载了代码,然后开始执行这些练习。 这本书是一个很好的指导,有很多代码来练习。 我读了前六章。 它讲述故事,同时解释最困难的概念。 那很好。 很高兴阅读。 我可以看到我的Core 2 Quad Q6700使用4个并发线程在C#中达到了98%的CPU使用率编程! 这比我想象的要容易。 我对你可以同时使用多个内核的结果印象深刻。 我向那些有兴趣开始使用C#的多核或线程编程的人推荐本书。

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

用Python的multiprocessing编写的multiprocessing可以很容易地修改,以在云上运送工作,而不是本地核心。 piCloud利用这一点在云上提供了大量的按需处理能力:您只需修改两行代码即可。

所以,这是一个外延:当select一个多核心库时,可能想问一个云方法是否也有意义。