Запустить функцию параллельно в асинхронном рабочем процессе? - PullRequest
0 голосов
/ 10 января 2019

следующий код

let doWork n = async {
    [1..5]
    |> Seq.iter(fun i ->
        System.Threading.Thread.Sleep 1000 // Simulate working
        printfn "%s runs %i seconds" n i
        )
}

let f1 = async {
    do! doWork "f1"
    return 1
}

async {
    let a = f1
    do! doWork "main"
    let! i = a
} |> Async.RunSynchronously

И это печатает следующий результат. Это показывает, что два вызова doWork выполняются последовательно.

main runs 1 seconds
main runs 2 seconds
main runs 3 seconds
main runs 4 seconds
main runs 5 seconds
f1 runs 1 seconds
f1 runs 2 seconds
f1 runs 3 seconds
f1 runs 4 seconds
f1 runs 5 seconds

Однако я хочу, чтобы doWork вызывался f1, а основной код работал параллельно?

1 Ответ

0 голосов
/ 10 января 2019

Попробуй так:

let computation () = async {
  printfn "Start work"
  do! Async.Sleep(100)
  printfn "Finished work"
}

let s = seq {
  for i in 1 .. 10 do
    let c = computation()
    yield c
}

s |> Async.Parallel |> Async.Ignore |> Async.Start

Async.Parallel преобразует Async<unit> list в Async<unit []>, который затем может быть запущен параллельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...