2013-01-07 140 views
0

我正在查找this article on F# optimizations,並對提到Tasks.Future.Create的行感到好奇。它似乎在未來創造了一項任務,似乎遵循Futures and Promises模式。在其他一些地方也提到了同樣的方法,如在this thread on benchmarking F#, Java, C#中,它也用於F#代碼。什麼/哪裏是Tasks.Future.Create和它的等價物是什麼?

我在想,上面提到的F#代碼,複製在這裏以供參考,如果鏈接死了,工作方式與Tasks.Task<T>類似,或者我應該使用不同的線程原語?

open System.Threading 

let inline sort cmp (a: _ array) = 
    let inline swap i j = 
    let t = a.[i] 
    a.[i] <- a.[j] 
    a.[j] <- t 
    let rec qsort l u = 
    if l < u then 
     swap l ((l + u)/2) 
     let mutable m = l 
     for i=l+1 to u do 
     if cmp a.[i] a.[l] < 0 then 
      m <- m + 1 
      swap m i 
     swap l m 
     if u-l > 1000 then 
     let m = m 
     let f = Tasks.Future.Create(fun() -> qsort l (m-1)) 
     qsort (m+1) u 
     f.Value 
     else 
     qsort l (m-1) 
     qsort (m+1) u 
    qsort 0 (a.Length-1) 

let inline cmp (str: _ array) i j = 
    let rec cmp i j = 
    if i=str.Length then 1 else 
     if j=str.Length then -1 else 
     let c = compare str.[i] str.[j] in 
     if c<>0 then c else 
      cmp (i+1) (j+1) 
    cmp i j 

let bwt (str: byte array) = 
    let n = str.Length 
    let a = Array.init n (fun i -> i) 
    sort (fun i j -> cmp str i j) a 
    Array.init n (fun i -> str.[(a.[i] + n - 1) % n]) 

注意:這是我的猜測,這是TPL預覽版中的一種方法。

+1

我認爲你的猜測是點亮的。它看起來像你想'Task.Factory.StartNew'和'Task.Result'(而不是'Value')。 – Daniel

+0

@丹尼爾:看起來很可能,感謝您查找正確的電話。我會試驗。 – Abel

回答

3

你說得對。它追溯到一個關於Design of Task Parallel Library的論文。引用的紙張的相關部分:

期貨是任務,其中,所述相關聯的動作計算 的結果的變體:

delegate T Func<T>(); 
class Future<T> : Task{ 
    Future (Func<T> function); 
    T Value{ get; } // does an implicit wait 
} 

未來的構造與具有函數功能類型的委託其中 T是委託的返回類型。未來的結果是通過Value屬性檢索到的 ,該值將內部調用爲 確保任務已完成並且結果值已計算爲 。由於Wait被調用,調用Value將拋出在計算未來值期間產生的異常 。可以通過 查看期貨作爲返回結果值或返回值的例外 。

在TPL現在您可以使用Task類做所有事情。作爲@Daniel說,你的例子可以寫成:

let f = Task.Factory.StartNew(fun() -> qsort l (m-1)) 
qsort (m+1) u 
f.Result 

我認爲當你有複雜的依賴關係的任務圖的未來格局更是實用。您可能想了解更多關於優秀書Parallel Programming with Microsoft .NET(其中包含許多好的F# samples)的模式。

+1

這完全是一個具有複雜依賴性的(深)調用圖,這讓我想到了這一點。感謝您的發言! – Abel

相關問題