Как я могу запускать эти две независимые петли одновременно параллельно.Как запустить код параллельно?
let a1=Seq.map2 (fun a b->(1.0-a)/(a-b)) a2 a3
let b1=Seq.map2 (fun a b->a*b) b2 b3
Как я могу запускать эти две независимые петли одновременно параллельно.Как запустить код параллельно?
let a1=Seq.map2 (fun a b->(1.0-a)/(a-b)) a2 a3
let b1=Seq.map2 (fun a b->a*b) b2 b3
Вы можете использовать стандартные задачи .NET для этого - нет специальных F # функции или специальный синтаксис для порождения вычисления в фоновом режиме:
let a1Work = Task.Factory.StartNew(fun() ->
Array.map2 (fun a b->(1.0-a)/(a-b)) a2 a3)
let b1 = Array.map2 (fun a b->a*b) b2 b3
let a1 = a1Work.Value
Я также изменил ваш Seq.map2
к Array.map2
- вычисления на последовательностях ленивы, и поэтому их запуск внутри задачи на самом деле ничего не сделает. С массивами весь расчет завершается немедленно.
попытка Array.zip
и Array.Parallel.map
?
Array.zip [|1;2;3|] [|2;3;4|] |> Array.Parallel.map (fun (a,b) -> a + b)
или просто использовать ParallelSeq
(см http://fsprojects.github.io/FSharp.Collections.ParallelSeq/ для получения дополнительной информации)
Если это шаблон, который вы оказываетесь регулярно использовать, это может быть полезно, чтобы написать обобщенную функцию, которая работает два Async
вычисления параллельно, например, как это:
module Async =
let Parallel2 (a: Async<'T>) (b: Async<'U>) : Async<'T * 'U> =
async {
let! res =
Async.Parallel [|
async { let! a = a in return box a }
async { let! b = b in return box b }
|]
return (res.[0] :?> 'T, res.[1] :?> 'U)
}
Вы можете использовать его следующим образом:
async {
let! a1, b1 =
Async.Parallel2
(async { return Array.map2 (fun a b->(1.0-a)/(a-b)) a2 a3 })
(async { return Array.map2 (fun a b->a*b) b2 b3 })
// ...
}
это 'a1 = a1Work.Value' или' a1 = a1Work.Result' – HaagenDaz
, если есть другой цикл 'пусть c1 = Seq.map2 (весело b-> а/б) с2 c3' мне нужно чтобы установить его как задачу? – HaagenDaz