多核和并发 - 语言,库和开发技术[关闭](Multi-Core and Concurrency -

2019-06-27 12:31发布

该CPU架构的景观发生了变化,多内核是将改变我们如何开发软件的趋势。 我已经做了多线程开发的C,C ++和Java,我已经做了使用各种IPC机制的多进程发展。 使用线程的传统方法似乎并不使它容易,为开发,利用,支持高度并行的硬件。

什么语言,库和开发技术是你意识到这一点有助于缓解创建并发应用程序的传统挑战? 我明明想的一样死锁和竞争条件的问题。 设计技术,库,工具等也是有趣的是,帮助采取实际优势,并确保正在利用现有的资源 - 只是写一个安全的,坚固的多线程应用程序并不能保证它使用所有可用的核心。

什么到目前为止,我所看到的是:

  • 二郎神 :基于流程,消息传递IPC,并发的“演员的模型
  • 剧中人 :为Ruby和Python演员模型库
  • 斯卡拉 :函数式编程语言,并增加了一些并发支持的JVM
  • Clojure的 :函数式编程语言与演员库JVM
  • 白蚁 :Erlang的过程方法的端口和消息传递方案

你知道还有什么做些什么,为你工作,你认为什么是有趣的手表?

Answer 1:

我建议两个范式转变:

软件事务内存

你可能想看看软件事务内存 (STM)的概念。 我们的想法是使用乐观并发 :在并行运行他人试图完成其在一个孤立的交易工作的任何操作; 如果在某一点另一个事务一直致力于这对无效此交易工作数据,事务的工作扔远,交易再次运行。

我认为首先广为人知实现这个想法的(证据的概念和第一个如果不)是一个在Haskell: 关于Haskell的事务内存的论文和报告 。 许多其他的实现都列在维基百科的文章STM 。

事件循环和承诺

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

需要注意的是其处理并发,以及语言设计的其他部分的方式,在很大程度上基于角色模型。



Answer 2:

你提到的Java,但你只提及线程。 你看Java的并发库? 它捆绑了Java 5中。

它包含的线程池一个非常好的图书馆,CopyOnWriteCollections命名寥寥无几。 检查出的文档Java教程 。 或者,如果你愿意, 在Java文档 。



Answer 3:

一些基于Scala的东西:

  • PiLib:托管语言对于Pi演算式并发
  • 没有控制反转基于事件的编程
  • 演员是统一线程和事件
  • 斯卡拉组播演员:架构和实施
  • 实现加入使用扩展模式匹配
  • 连通的Scala对象(修订本)


Answer 4:

我用处理为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 )。



Answer 5:

英特尔线程构建模块的C ++看起来很有意思的。 它提供了抽象比原纱的更高的水平。 奥赖利有一个非常不错的书 ,如果你想死树文档。 同样,见, 与英特尔线程构建模块任何经验? 。



Answer 6:

我会说:

机型:线程共享+状态,演员+消息传递,事务存储器,地图/降低? 语言:二郎,IO,Scala中,Clojure中,区域环境影响评价图书馆:Retlang,Jetlang,奇勒姆,Cilk的++,叉子/加入,MPI,Kamaelia,兵马俑

我保持对这样的(二郎,斯卡拉,Java线程,角色模型等)的东西并发链接的博客,并把一对夫妇每天链接:

http://concurrency.tumblr.com



Answer 7:

我一直在做并行编程阿达了近20年。

语言本身(而不是一些上涨了库)支持线程(“任务”),多重调度模型,以及多个同步范例。 你甚至可以使用内置的原语构建自己的同步方案。

你可以认为阿达的会合作为某种面向过程的同步工具,同时保护对象更加面向对象的。 交会类似于老CS概念显示器 ,但更强大。 受保护的对象是特殊类型的同步原语,让你建立的东西酷似OS锁,信号量,事件,等等。然而,这是不够强大,你也可以发明和创造自己种同步对象,根据您的具体需求。



Answer 8:

现在的问题是什么并行编程模型今天你推荐你把明天的多核处理器的优势? 已经问。 我给了以下的答案也有。

Kamaelia是有很多沟通的过程中构建应用程序的蟒蛇框架

Kamaelia - 并发进行了有益的,好玩的

在Kamaelia你建立从互相交谈简单的组件系统。 这加快发展,大规模有助于维护和也意味着你打造自然并发软件 。 它的目的是通过任何开发人员,其中包括新手访问。 这也使得它的乐趣:)

什么样的系统? 网络服务器,客户端,桌面应用程序,基于Pygame的游戏,转码系统和管道,数字电视系统,垃圾邮件eradicators,教学工具,并有相当数量更多:)

Here's a video from Pycon 2009. It starts by comparing Kamaelia to Twisted and Parallel Python and then gives a hands on demonstration of Kamaelia.

易并发性Kamaelia -第1部分 (59:08)
易并发性Kamaelia -第2部分 (18:15)



Answer 9:

我保持一个密切关注的.NET并行扩展和并行LINQ 。



Answer 10:

我知道的区域环境影响评价 -这是基于爱尔兰,但看起来更像是Python的/ Ruby的语言。



Answer 11:

这个问题是密切相关的,如果不重复什么并行编程模型今天你推荐采取明天的多核处理器的优势做?



Answer 12:

Java有一个演员库太你知道 。 你知不知道,歼AVA是一种功能性的语言? ;)



Answer 13:

OpenMP的 。

它为你处理线程,这样就只担心,你的C ++应用程序的部分要并行运行。

例如。

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

上面的代码将在尽可能多的线程运行在for循环中你告诉OpenMP运行时使用,所以如果尺寸为100,和你有一个四芯盒,这对循环将运行在每个核心25个项目。

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



Answer 14:

的C ++ 0x将提供std::lock用于锁定一个以上互斥一起的功能。 这将有助于缓解僵局,由于乱序锁定。 此外,的C ++ 0x线程库将有承诺,期货和包装任务,这允许线程等待,无需任何用户级锁在另一个线程上执行的操作的结果。



Answer 15:

multiprocessing是一个Python库,它简化了多核心编程,在另一个答案mentionned。

与Python的书面计划multiprocessing可以很容易地修改,以出货云上的工作,而不是当地的核心。 piCloud利用的是提供云上的大,按需处理能力:你只需要修改2行代码的。

所以,这里是外卖:选择针对多核心库时,人们可能要问云的做法是否也有道理。



文章来源: Multi-Core and Concurrency - Languages, Libraries and Development Techniques [closed]