CPU架构格局发生了变化,多核心趋势将改变我们开发软件的方式.我已经完成了C,C++和Java的多线程开发,我使用各种IPC机制完成了多进程开发.对于开发人员来说,使用线程的传统方法似乎并不容易使用支持高度并发性的硬件.
您了解哪些语言,库和开发技术有助于缓解创建并发应用程序的传统挑战?我显然在考虑死锁和竞争条件等问题.设计技术,库,工具等也很有趣,它们有助于实际利用并确保可用资源的利用 - 只需编写一个安全,健壮的线程应用程序并不能确保它使用所有可用的内核.
到目前为止我看到的是:
Erlang:基于流程,消息传递IPC,'actor的并发模型
Dramatis:Ruby和Python的actor模型库
Scala:JVM的函数编程语言,增加了一些并发支持
Clojure:具有actor库的JVM的函数编程语言
白蚁:Erlang的流程方法和传递给Scheme的消息的端口
您还知道什么,对您有用的内容以及您认为有趣的内容是什么?
我建议两种范式转变:
软件事务内存您可能想要了解软件事务内存(STM)的概念.我们的想法是使用乐观并发:任何与其他操作并行运行的操作都会尝试在隔离的事务中完成其工作; 如果在某个时刻已经提交了另一个事务,该事务使该事务正在运行的数据无效,则该事务的工作将被丢弃并且事务再次运行.
我认为第一个广为人知的想法实现(如果不是概念验证和第一个)是Haskell中的一个:关于Haskell中事务内存的论文和演示.维基百科的STM文章中列出了许多其他实现.
事件循环和承诺处理并发性的另一种非常不同的方法是在[E编程语言]中实现的(http://en.wikipedia.org/wiki/E_(programming_language%29).
请注意,它处理并发的方式以及语言设计的其他部分主要基于Actor模型.
你提到过Java,但你只提到了线程.你看过Java的并发库了吗?它与Java 5及更高版本捆绑在一起.
这是一个包含ThreadPools的非常好的库,CopyOnWriteCollections只列举了一些.查看Java Tutorial中的文档.或者如果您愿意,可以使用Java文档.
一些基于Scala的东西:
PiLib:Pi-Calculus风格并发的托管语言
基于事件的无控制反转编程
统一线程和事件的Actor
Scala多播播放器:架构和实现
使用可扩展模式匹配实现联接
传达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))
这会使用很多处理器来计算结果.还有lazy(Pool.imap
)和异步变体(Pool.map_async
).
有一个实现的队列类 Queue.Queue
,以及与线程类似的工作者.
processing
基于fork()
,必须在Windows上进行模拟.对象通过pickle
/ 传输unpickle
,因此您必须确保它有效.分叉已经获得资源的进程可能不是您想要的(想想数据库连接),但通常它可以工作.它运行良好,已经在快速通道上添加到Python 2.6(参见PEP-317).