2012-12-16 60 views
0

好吧,我準備放棄這一點。斯卡拉Continuations:暫停沒有等待/睡眠()

我想保存一個延續的狀態(用shift完成)。 但是,需要注意的是復位後的代碼不應執行。考慮工作線程正在執行的延續,應該不再進行處理。繼續被保存在可以恢復的全局繼續列表中,其後的所有其他事項都被忽略並且不應執行。

工作者線程必須存活(無法中止或銷燬需要啓動新線程)。

reset { 
    shift { 
    (cont:Unit=>Unit) => 
     println(1) 
     suspend() // how would I implement something like this? 
     cont() 
    } 

    println(3) 
} 

println(2) 

應該產生

1 

恢復延續那麼應該產生

3 
2 

目前這似乎可能根本不會,因爲延續僅限於重置的範圍。但我想我會給StackOverflow一個裂縫。


編輯:基本上......(也許我應該把這個更早)我想調用一個方法,並暫停執行,直到它準備給我一個結果,我想了一個實現這一偶數循環,而不是線程同步。

+0

嗯,我認爲這是不可能的這種方式,但什麼是延長復位範圍的問題嗎?你知道cpsParam註釋,它允許使用shift內部方法,它根本沒有重置,所以當調用這個方法出現在一些重置內部時,它會工作在預期的方式嗎?你也可以使用嵌套重置。 – aemxdp

+0

我可以擴展重置範圍,但在重置期間寫入的代碼將由第三方完成,因此我無法控制代碼,並且將@cpsParam設置爲不可行/方便。 –

回答

1

我不知道,這是否適用於您的情況,但我這裏是如何混合多種復位:

type Proc = Unit => Unit 

    val resume = reset { 
    shift { k1: Proc => 
     reset { 
     shift { k2: Proc => 
      println(1) 
     () => k2(); k1() 
     }   
     println(3) 
     } 
    } 
    println(2) 
    } 
    // 1 

    resume() 
    // 3 
    // 2 

更新: 這裏是如何使用方法使用此:

def f(): Unit @cpsParam[Unit,() => Unit] = { 
    println(0) 

    shift { k1: Proc => 
     reset { 
     shift { k2: Proc => 
      println(1) 
     () => k2(); k1() 
     }   
     println(2) 
     } 
    } 

    println(3) 
    } 

    val continue = reset { 
    println(-1) 
    f() 
    println(4) 
    } 

    println("...") 

    continue() 

打印:

-1 
0 
1 
... 
2 
3 
4 

這裏是如果你不WA做什麼NT暫停通話到f之後一切,直到復位的結局:

reset { 
    println(-1) 
    shift { k: Proc => 
     reset{f()}() 
     k() 
    } 
    println(4) 
    } 

    println("...") 

打印:

-1 
0 
1 
2 
3 
4 
... 
+0

我覺得這讓我走向正確的方向。 是否有必要將@cpsParam放在調用堆棧的所有方法上?會有更方便的方法嗎? –

+0

只有那些包含裸體轉換或其他方法的註釋纔是這樣的。它需要靜態類型 - 否則編譯器無法知道您的移位控制流將以哪種類型結束,並且需要進行cps轉換 - 否則編譯器不會在繼續傳遞樣式中轉換方法。但是你通常可以避免編寫返回類型,並且類型推斷會得到正確的註釋。 – aemxdp

+0

嗯,我還沒有取得很大的進展,事實上似乎並沒有一個現有的解決方案,因爲我正在嘗試所以我擱置它。無論如何感謝您的答案。 –