【问题标题】:What does it mean for readers to have their own timeline读者拥有自己的时间线意味着什么
【发布时间】:2013-09-21 23:16:20
【问题描述】:

Rich Hickey 在他的演讲 are we there yet 57:25 中谈到了多版本并发控制。列出的优势之一是读者能够拥有自己的时间表。我很好奇这在实践中意味着什么。这是通过简单地让读者保存观察值的历史来完成的吗?还是在clojure的STM的帮助下以某种方式完成的?很高兴看到如何在 clojure 中使用它的示例。

【问题讨论】:

    标签: clojure


    【解决方案1】:

    我认为 Rich 的意思是交易之外的读者在每次尝试读取值时都会看到处于当前状态的世界,并且这种世界观对于他们每个人来说都是个人的。

    当您有两个不相关的函数(未绑定在同一事务中)试图获取变量(原子、引用、代理等)的当前值时,它们不能保证获得(参见)相同的值。

    例子:

    (let [
      ; 1.
      counter (ref 0)
    
      ; 2.
      _ (.start (Thread. (fn [] (while (< @counter 1000000) 
                                   (dosync (alter counter inc))))))
      _ (Thread/sleep 10)
    
      ; 3.
      _ (let [r1 @counter
              _ (Thread/sleep 1)
              r2 @counter]
           (println "free reader 1: " r1 "free reader 2:" r2))
      ; 4.
      _ (dosync (let [r1 @counter
                      _ (Thread/sleep 1)
                      r2 @counter]
           (println "frozen reader 1: " r1 "frozen reader 2:" r2)))
    
      _ (println "---------------------------------")])
    

    样本输出:

    free reader 1:  30573 free reader 2: 31295
    snapshot reader 1:  105498 snapshot reader 2: 105498
    ---------------------------------
    free reader 1:  37567 free reader 2: 38369
    snapshot reader 1:  181392 snapshot reader 2: 181392
    ---------------------------------
    free reader 1:  37317 free reader 2: 88570
    frozen reader 1:  467471 frozen reader 2: 467471
    ---------------------------------
    

    它是如何工作的:

    1. 声明一个计数器变量为ref(事务变量类型),并将其初始值设置为0

    2. 使用匿名函数创建 Java 线程,该函数通过在循环中递增计数器来更改计数器并“启动”线程。

    3. 以两步方式读取计数器,间隔 1 ms 延迟并打印每个值。如您所见,这两个值与预期的不同。这模拟了不同的时间线,当观察同一对象的两个对象接收到不同的数据时。

    4. 与上面相同,但在世界快照中。设置睡眠功能不会影响输出值。他们两个是平等的。

    【讨论】:

    • 谢谢。出于某种原因,我认为自己的时间线意味着读者可以访问价值观的历史,但我现在明白了,这只是意味着他们看到了当前的状态。
    猜你喜欢
    • 1970-01-01
    • 2019-06-22
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多