并行运行
let bufferData (number:int) =
[| for count in 1 .. 1000 -> byte (count % 256) |]
|> Array.permute (fun index -> index)
let writeFiles bufferData =
Seq.init 1000 (fun num -> bufferData num)
|> Seq.mapi (fun num value ->
async {
let fileName = "file" + num.ToString() + ".dat"
use outputFile = System.IO.File.Create(fileName)
do! outputFile.AsyncWrite(value)
})
|> Async.Parallel
|> Async.Ignore
writeFiles bufferData|> Async.Start
open System
open System.Threading.Tasks
Parallel.For (0, 100,
fun i ->
printfn "Starting %d ..." i
System.Threading.Thread.Sleep (100*i%8)
printfn "Finished %d ..." i
)
输出结果:
Starting 0 ...
Starting 50 ...
Finished 0 ...
Starting 1 ...
Finished 50 ...
Starting 51 ...
Finished 1 ...
Starting 2 ...
Finished 2 ...
Starting 3 ...
Finished 51 ...
......
Parallel.ForEach ([0..10],
fun i ->
printfn "Starting %d ..." i
System.Threading.Thread.Sleep (100*i%8)
printfn "Finished %d ..." i
)
结果同上。
let prog i =
async {
printfn "Starting %d ..." i
do! Async.Sleep (100%(i+1)*10)
printfn "Finished %d ..." i
return 1
}
let result =
[0..99]
|> Seq.map prog
|> Async.Parallel
|> Async.StartAsTask
输出结果:
...
Starting 98 ...
Starting 99 ...
Finished 99 ...
Finished 49 ...
Finished 32 ...
Finished 24 ...
Finished 23 ...
Finished 19 ...
Finished 18 ...
Finished 15 ...
Finished 13 ...
Finished 11 ...
....