65.9K
CodeProject 正在变化。 阅读更多。
Home

F# 异步编程

starIconstarIconstarIconemptyStarIconemptyStarIcon

3.00/5 (2投票s)

2010年7月27日

CPOL

1分钟阅读

viewsIcon

19245

在 F# 等函数式语言中进行异步编程真是轻而易举……

引言

F# 是一种强类型语言,类似于 C#,但具有轻量级语法,通常出现在 Python 等动态语言中。这使得您的 F# 程序具有轻量级、数学化的感觉。

基本上,我们未来将不会获得更快的 CPU。我们将获得的是更多的 CPU。程序员面临的挑战是编写能够利用这些额外 CPU 的软件…… 似乎每篇关于并发的教程都必须引用 Herb Sutter 在软件领域的 免费午餐结束了:向并发的根本转变

背景

还有许多其他地方可以找到有关 F# 的有用信息。首先,有一个官方 F# 网站,您可以在其中找到语言规范、文档和其他有用的资源。 还有两本关于 F# 的书(一本已经出版)Expert F#(作者:Don Syme、Adam Granicz 和 Antonio Cisternino)和 Foundations of F#(作者:Robert Pickering)。

Using the Code

本教程的代码展示了如何在 F# 中实现这一点,以及它是多么容易。

open System

type Class1 (ind:int) = 
    let randomnum = new Random()
    member this.Func1 () = 
        System.Threading.Thread.Sleep(randomnum.Next(5)*1000)
        printfn "this is the thread name %A" ind      

type public SampleAsync () =

    let listofClass1 = 
        [for i in 1 .. 10 -> new Class1(i)]

    member public this.fetchAsync(cls:Class1) = 
        async{
            try
                cls.Func1()
            with
                | ex -> printfn "error: %A" ex.Message
        }

    member public this.runAll() =
        listofClass1
        |> Seq.map this.fetchAsync
        |> Async.Parallel 
        |> Async.RunSynchronously
        |> ignore

let sampleasync = new SampleAsync()
sampleasync.runAll()

在这里,我创建了一个简单的类,该类具有一个成员,该成员在每个类上生成一个随机休眠。

关注点

F# 会取代 C++ 吗?

至少在某种程度上,F# 程序可以与 C++ 程序相媲美。以下是 Flying Frog 博客的链接,人们在那里对光线追踪进行了比较

http://fsharpnews.blogspot.com/2010/03/f-vs-unmanaged-c-for-parallel-numerics.html

“我们最近在比较用 F# 和 C++ 编写的优化并行光线追踪器时,获得了一个令人惊讶的性能结果。以下两个程序渲染相同的复杂场景,其中包含超过一百万个对象。令人惊讶的是,136 行托管 F# 程序运行速度略快,为 17 秒,而 168 行非托管 C++ 程序需要 18 秒。”

© . All rights reserved.