F#第五课:异步工作流

本文探讨了使用F#进行异步编程的具体实践,包括如何处理大量图片转换任务,并通过示例展示了旧语法到新语法的迁移过程。

没来得及写出来学习心得,暂时写一下Expert F#关于异步程序的文章中例子一些过时语法和相应的改进

 

代码
#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"
 
另外一处代码是
代码

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)

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值