Я уже некоторое время использую рабочий процесс F # Asyn c и мне это очень нравится. Недавно я работаю над проектом, включающим множество независимых вычислений на отдельном кадре Deedle Frame, который я использую Async.Parallel
. И в этих асинхронных режимах многие другие асинхронные методы также вычисляются параллельно (вложенный Asyn c?). Мой код выглядит примерно так:
let processRoomAsync room =
async{
let x = do_something room
return x
}
let processCompressorAsync compressor =
async{
let rooms = get_rooms_from_compressor compressor
let! y =
Array.map processRoomAsync rooms
|> Async.Parallel
return do_something_with_y y
}
let processBuilding building =
let compressors = get_compressors_for_building building
let processResult =
Array.map processCompressorAsync compressors
|> Async.Parallel
|> Async.RunSynchronously
do_something_with_result processResult
Идея приведенного выше кода заключается в том, что у меня есть building
, например, отель, с множеством A C compressors
, каждый compressor
обслуживает множество rooms
. Мне нужно обработать все rooms
данные, которые подключаются к одному compressor
, чтобы смоделировать эту compressor
мощность. Затем все данные compressors
агрегируются, чтобы получить общий результат building
.
Когда количество Asyn c мало, результат ожидается при сравнении с временем выполнения одного asyn c.
Однако, когда количество asyn c больше 100, я замечаю значительное ухудшение вычислительного времени. Я прочитал какой-то документ о maxDegreeOfParallelism
, но не совсем понимаю, какой номер мне следует использовать. Должно ли это быть количество виртуальных ЦП на моем компьютере? Если да, то как насчет вложенных Async.Parallel
? Я пробовал несколько значений, и улучшение было минимальным.
Я где-то читал, что мне следует использовать MailboxProcessor
, но не совсем понимаю этого. Кроме того, в некоторой документации говорится, что async
предназначен для ввода-вывода, а не для вычислений, и этот сообщение , кажется, предлагает использовать Hopac
, но мне интересно, стоит ли тратить время на изучение этого?
Спасибо и извините за длинный вопрос.