不可知的语言-使用软件事务存储有任何现实世界的经验吗?

似乎最近对STM(软件事务存储)框架和语言扩展有了越来越高的兴趣。 Clojure特别具有出色的实现,它使用MVCC(多版本并发控制)而不是滚动提交日志。 GHC Haskell还具有非常优雅的STM monad,它也可以进行交易组合。 最后,为了稍微说一下我自己的号角,我最近为Scala实现了一个STM框架,该框架静态地强制执行引用限制。

所有这些都是有趣的实验,但似乎仅限于该领域(实验)。 所以我的问题是:你们中的任何人在现实世界中见过或使用过STM吗? 如果是这样,为什么? 它带来了什么好处? 性能如何? (在这一点上似乎有很多相互矛盾的信息)您将再次使用STM还是更喜欢使用其他并发抽象(例如actor)?

6个解决方案
29 votes

我参与了Haskell的BitTorrent客户的业余爱好开发(命名为conjure)。 它非常大量地使用STM来协调不同的线程(每个对等点1个+用于存储管理的1个+用于整体管理的1个)。

好处:更少的锁,可读的代码。

速度不是问题,至少不是由于STM的使用。

希望这可以帮助

ADEpt answered 2019-10-09T19:19:49Z
26 votes

文章“软件事务存储:为什么它只是一个研究玩具?” 没有考虑Haskell的实现,这是一个很大的遗漏。 正如文章所指出的那样,STM的问题是,实现必须在使所有变量访问变为事务性(除非编译器可以证明它们安全(这会降低性能))或让程序员指出要进行事务处理(这会降低简单性)之间进行选择。 和可靠性)。 但是,Haskell实现使用Haskell的纯净性来避免使大多数变量使用事务性的需求,而类型系统则提供了一个简单的模型以及对事务性变异操作的有效实施。 因此,Haskell程序可以将STM用于线程之间真正共享的那些变量,同时保证非事务性内存的使用安全。

Paul Johnson answered 2019-10-09T19:20:14Z
26 votes

我们在Galois(位于Haskell)的高并发应用中非常常规地使用它。 它有效,在Haskell世界中广泛使用,并且不会死锁(当然,您可能会争执太多)。 如果我们设计正确的话,有时我们会重写一些东西以使用MVars-因为它们更快。

只需使用它。 没什么大不了的。 就我而言,Haskell中的STM已“解决”。 没有进一步的工作要做。 因此,我们使用它。

Don Stewart answered 2019-10-09T19:20:45Z
11 votes

我们,factis research GmbH,正在生产中使用Haskell STM和GHC。我们的服务器从主要的“数据服务器”接收有关新的和修改的“对象”的消息流,它动态地转换此事件流(通过生成新对象,修改对象,汇总事物等),并计算出这些新的对象应同步到已连接的iPad。它还从iPad接收表单输入,这些输入经过处理,与“主流”合并并且还同步到其他iPad。我们将STM用于需要在线程之间共享的所有通道和可变数据结构。 Haskell中的线程非常轻巧,因此我们可以在不影响性能的情况下使用很多线程(目前每个iPad连接5个线程)。构建大型应用程序始终是一个挑战,需要学习很多教训,但是STM从未遇到任何问题。它总是按照您天真的期望工作。我们必须进行一些认真的性能调整,但STM从来都不是问题。 (80%的时间我们试图减少短期分配和总体内存使用。)

STM是Haskell和GHC运行时真正发挥作用的领域。 这不仅是实验,而且不仅仅用于玩具程序。

我们正在Scala中构建我们的临床系统的其他组件,并且到目前为止一直在使用Actors,但是我们确实缺少STM。 如果有人对在生产中使用一种Scala STM实现有什么样的经验,我希望能收到您的来信。 :-)

David Leuschner answered 2019-10-09T19:21:23Z
4 votes

我们已经在C语言中自已的STM实现基础上实现了整个系统(内存数据库和运行时)。在此之前,我们有一些基于日志和锁的机制来处理并发,但这很难维护。 我们对STM非常满意,因为我们可以以相同的方式对待每个操作。 几乎所有的锁都可以删除。 现在,我们几乎所有大小的任何事物都使用STM,甚至在顶部都有一个内存管理器工具。

性能不错,但是为了加快速度,我们现在与ETH Zurich合作开发了一个自定义操作系统。 系统本身支持事务性内存。

但是,STM也带来了一些挑战。 特别是对于较大的事务和热点,这会导致不必要的事务冲突。 例如,如果两个事务将一个项目放入一个链表中,则会发生不必要的冲突,而使用无锁数据结构可以避免这种冲突。

gtroxler answered 2019-10-09T19:22:00Z
1 votes

我目前在某些PGAS系统研究中使用Akka。 Akka是一个Scala库,用于使用Actors,STM和内置的容错功能来开发可扩展的并发系统,这些功能是根据Erlang的“让它失败/崩溃/崩溃/崩溃/失败”哲学建模的。 据说Akka的STM实现是基于Clojure的STM实现的Scala端口构建的。 可以在此处找到Akka STM模块的概述。

Marc answered 2019-10-09T19:22:24Z
translate from https://stackoverflow.com:/questions/209751/any-real-world-experience-using-software-transactional-memory