2013-01-07 82 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

相关问题