首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取并发环境中复杂可变结构的快照。

获取并发环境中复杂可变结构的快照。
EN

Stack Overflow用户
提问于 2011-12-17 13:12:01
回答 3查看 283关注 0票数 5

给出:是各种嵌套集合的复杂结构,参考文献分散在不同的层次上。

需要:--一种在其他线程中继续进行写入的方式,以获取此类结构的快照。

因此,一个“读取器”线程需要在一个长事务中读取整个复杂状态。同时,“编写者”线程在多个短事务中进行修改。据我所知,在这种情况下,STM引擎利用参考文献的历史。

这里我们有一些有趣的结果。例如,读者在交易开始后的10秒钟内到达一些参考文献。编写者每1秒修改一次这个引用。这就产生了10个参考文献的历史值。如果超出了ref的:max-history限制,读取器事务将永远运行。如果超过:min-history,事务可能会多次重新运行。

但实际上,读者只需要一个参考值(第一个),而作者只需要最近的一个。历史列表中的所有中间值都是无用的。有没有办法避免这样的历史过度使用?

谢谢。

EN

回答 3

Stack Overflow用户

发布于 2011-12-19 11:50:05

对我来说,有大量嵌套参考的大型结构有点“设计味”。您实际上是在模拟一个可变的对象图,如果您相信Rich的并发性,这是个坏主意

有一些不同的想法要尝试:

  • 在Clojure中解决这个问题的惯用方法是将状态放在一个顶级引用中,其中的所有内容都是不可变的。然后读取器可以免费获取整个并发状态的快照(甚至不需要事务)。从目前的情况来看,可能很难对此进行重构,但我认为这是最佳实践。
  • 如果您只想让读者获得顶级参考的快照,您可以直接在事务之外删除它。请注意,内部的引用可能会继续发生变化,因此这是否有用取决于您对读者的一致性要求。
  • 你可以在(多辛奇.)对于读者和作者来说事务都是正常的。您可能会得到争用和事务重试,但可能不是问题。
  • 您可以创建一个“快照”函数,该函数可以快速遍历图并取消事务中的所有引用,返回结果,去掉引用(或替换为新的克隆引用)。读取器只调用一次快照,然后在快照完成后继续执行其余的工作。
  • 每次编写完成后,您都可以立即拍摄快照,并将其单独存储在一个原子中。读取器可以直接使用它(即只有写入线程直接访问活动数据图)
票数 1
EN

Stack Overflow用户

发布于 2011-12-17 20:28:22

对你问题的一般回答是,你需要两件事:

  1. 指示系统处于“快照写入”模式的标志。
  2. 一个队列,用于保存系统处于快照模式时发生的所有事务。

至于如果队列溢出,因为快照进程不够快,那么除了优化进程或增加队列大小之外,没有什么可以做的--这将是一种平衡,取决于应用程序的需求。这是一个微妙的平衡,并将进行一些相当广泛的测试,这取决于您的系统有多复杂。

但你走的路是对的。如果您基本上将系统置于“快照写入模式”中,那么您的读取器/写入方法应自动更改它们从何处读取/写入的位置,以便正在进行更改的线程获取所有“当前值”,而读取快照状态的线程则读取所有“快照值”。您可以将它们分成不同的方法-快照阅读器将使用“快照值”方法,所有其他线程将读取“当前值”方法。

当快照阅读器完成其工作时,它需要清除快照状态。

如果线程在当前没有设置“快照状态”时尝试读取“快照值”,则应该使用“当前值”进行响应。没什么大不了的。

允许为备份目的拍摄文件系统快照的系统,同时不阻止写入新数据,请遵循类似的方案。

最后,除非您需要保存所有更改到系统的记录(即用于审计跟踪),否则事务队列实际上不需要是要应用的更改队列--它只需要存储系统中任何更改的最新值。当清除“快照状态”时,只需将所有未提交的值写入系统,并将其称为完成。您可能需要考虑的是记录那些尚未进行的更改,以防您需要从崩溃中恢复,并且仍然应用这些更改。日志文件将为您提供所发生的事情的记录,并允许您执行此恢复。这是对恢复过程的过度简化,但这并不是你的问题所在,所以我将就此结束。

票数 0
EN

Stack Overflow用户

发布于 2012-05-01 23:40:41

你所追求的是高性能并发的最先进的状态。您应该看看Nathan的工作,以及他与Aleksandar、Phil和Scala团队的合作。

二叉树:http://ppl.stanford.edu/papers/ppopp207-bronson.pdf https://github.com/nbronson/snaptree/

数组树-based散列映射http://lampwww.epfl.ch/~prokopec/ctries-snapshot.pdf

然而,快速查看上面的实现应该可以让您相信,这不是“滚动自己”的领域。如果可能的话,我会尝试调整一个现成的并发数据结构来满足您的需要。我链接到的所有内容在JVM上都是免费可用的,但它不是本地Clojure的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8544990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档