Обрабатывать функцию параллельно / асинхронно и добавлять результаты, возвращая один список результатов?

У меня есть функция, которая возвращает строку [].

let asyncScrape url allParameters =
    allParameters
    |> Seq.map(fun v ->
        yearAndClassResultsAsync url v)
        |> Async.Parallel
        |> Async.RunSynchronously

Я хочу выполнить итерацию по этому массиву строк, отправив каждую строку в метод с именем resultsBody (который возвращает seq), а затем, наконец, вернуть одну последовательность, которая представляет собой конкатенацию результатов из resultsBody.

Я попытался сделать что-то вроде ниже, но я довольно потерян, когда он возвращается:

seq<string[]>[] 

и я просто хочу объединить сингл

seq<string[]>

Мои попытки до сих пор:

let parseSite html =
    Array.mapi (fun s -> resultsBody) html

person CGross    schedule 05.06.2014    source источник
comment
На этот вопрос было бы намного легче ответить, если бы вы привели минимальный пример своей проблемы.   -  person GS - Apologise to Monica    schedule 06.06.2014
comment
@GaneshSittampalam обновил исходный вопрос с минимальным примером   -  person CGross    schedule 06.06.2014


Ответы (1)


Упрощенно, я думаю, ваша проблема в том, что у вас есть вложенная последовательность strings, и вы хотите получить как можно больше параллелизма, а не только на самом внутреннем уровне вложенности.

Один из способов сделать это - также вложить вызовы Async.Parallel перед вызовом Async.RunSynchronously. Вот простой пример техники:

let squareInt n = async { return n*n }

let inParallel (seqOfseqOfInts : seq<seq<int>>) =
    seqOfseqOfInts
        |> Seq.map        // deal with each inner seq of ints
            (fun (seqOfInts : seq<int>) ->
                seqOfInts
                    |> Seq.map squareInt
                    |> Async.Parallel // this gives us Async<int[]>
            ) // this gives us seq<Async<int[]>>
        |> Async.Parallel // this gives us Async<int[][]>
        |> Async.RunSynchronously // this gives us int[][]
person GS - Apologise to Monica    schedule 05.06.2014
comment
Я обновил свой исходный пост, добавив более четкую / краткую информацию, так как он работает асинхронно, но просто не могу получить нужный мне тип данных. - person CGross; 06.06.2014
comment
Вы пробовали мой ответ, но с тремя уровнями Async.Parallel? - person GS - Apologise to Monica; 06.06.2014