F#第五课:异步工作流
没来得及写出来学习心得,暂时写一下Expert F#关于异步程序的文章中例子一些过时语法和相应的改进
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#light
open System
open System.IO
open Microsoft.FSharp.Control
open Microsoft.FSharp.Control.CommonExtensions
let numImages = 200
let size = 512
let numPixels = size * size
let TransfromImage(pixels, imageNum) =
printfn "TransformImage %d" imageNum
// 实现频繁CPU计算操作
pixels |> (Array.map(fun b -> b + 1uy))
let ProcessImageAsync(i) =
async {
use inStream = File.OpenRead(sprintf "Image%d.tmp" i)
let! pixels = inStream.ReadAsync(numPixels) // 改为AsyncRead
let pixels' = TransfromImage(pixels, i)
use outStream = File.OpenWrite(sprintf "Image%d.done" i)
do! outStream.WriteAsync(pixels') // 改为AsyncWrite
}
let ProcessImagesAsync() =
printfn "ProcessImagesAsync..."
let tasks = [for i in 1..numImages -> ProcessImageAsync(i)]
Async.Run(Async.Parallel tasks) |> ignore // 改为RunSynchronously
printfn "ProcessImagesAsync finished"
open System
open System.IO
open Microsoft.FSharp.Control
open Microsoft.FSharp.Control.CommonExtensions
let numImages = 200
let size = 512
let numPixels = size * size
let TransfromImage(pixels, imageNum) =
printfn "TransformImage %d" imageNum
// 实现频繁CPU计算操作
pixels |> (Array.map(fun b -> b + 1uy))
let ProcessImageAsync(i) =
async {
use inStream = File.OpenRead(sprintf "Image%d.tmp" i)
let! pixels = inStream.ReadAsync(numPixels) // 改为AsyncRead
let pixels' = TransfromImage(pixels, i)
use outStream = File.OpenWrite(sprintf "Image%d.done" i)
do! outStream.WriteAsync(pixels') // 改为AsyncWrite
}
let ProcessImagesAsync() =
printfn "ProcessImagesAsync..."
let tasks = [for i in 1..numImages -> ProcessImageAsync(i)]
Async.Run(Async.Parallel tasks) |> ignore // 改为RunSynchronously
printfn "ProcessImagesAsync finished"
另外一处代码是
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
let processImagesRepeats = 20
let repeatN pixels =
pixels |> Array.map(fun b-> b + 1uy)
let TransformImage (pixels, imageNum) =
printfn "TransformImage %d" imageNum
// 实现频繁CPU计算操作
[for i in 1..processImagesRepeats -> repeatN pixels] // 原来这里的语法是pixels |> Func.RepeatN processImagesRepeats (Array.map(fun b-> b + 1uy)) 由于Func.RepeatN已经被F#库移除,所以只能用这样的语法代替
let ProcessImageSync (i) =
use inStream = File.OpenRead (sprintf "Image%d.tmp" i)
let pixels = Array.zeroCreate numPixels
let nPixels = inStream.Read (pixels, 0, numPixels)
let pixels' = TransformImage (pixels, i)
use outStream = File.OpenWrite (sprintf "Image%d.done" i)
outStream.Write (pixels'.[0], 0, numPixels)
将想法付诸于实践,借此来影响他人是一个人存在的真正价值