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)

 

 

 

你可能感兴趣的:(工作流)