Я извлекаю данные из API Bloomberg и удивляюсь медленности. Мое вычисление ограничено этим.преобразование блокировки потока для блокировки без потока в f #
Поэтому я решил использовать какой-то асинхронный построитель монады, чтобы развязать его. После запуска результаты не намного лучше, что было очевидно, когда я делаю вызов функции NextEvent, которая является блокировкой потоков.
let outerloop args dic =
...
let rec innerloop continuetoloop =
let eventObj = session.NextEvent(); //This blocks
...
let seqtable = reader.ReadFile(@"C:\homeware\sector.csv", ";".[0], true)
let dic = ConcurrentDictionary<_,_>()
let wf = seqtable |> Seq.mapi (fun i item -> async { outerloop item dic })
wf |> Async.Parallel
|> Async.RunSynchronously
|> ignore
printfn "%A" ret
Есть хороший способ, чтобы обернуть, что блокирующий вызов к блокирующим вызову? Кроме того, почему структура async не создает столько потоков, сколько у меня есть запросы (например, 200)? когда я инспектировать нити, из которых я получаю значение я вижу только 4-5, которые используются ..
UPDATE
Я нашел убедительную причину, почему он никогда не будет возможно. Операция async берет то, что после инструкции async, и планируйте ее где-то в threadpool. для всего, что имеет значение, до тех пор, пока функция асинхронизации используется правильно, то есть, всегда возвращаясь к файлу threadpool, от которого он произошел, мы можем считать, что мы выполняемся в одном потоке.
Будучи на одном потоке, все планирование должно выполняться где-то позже, а команда блокировки не может избежать того факта, что, в конце концов, после ее запуска ему придется блокировать в какой-то момент в будущем поток.
Как бы создать 200 потоков вам ни при каких обстоятельствах? Если у вас было 200 соединений, у вас будет 200 очень медленных соединений, а не только несколько быстрых. (Не упоминание 200 МБ накладных расходов.) – svick
Кроме того, если ваша операция блокируется IO, то использование большего количества ЦП не принесет вам большой пользы. Он медленный, потому что сеть работает медленно, и вы не будете делать свою сеть быстрее, используя больше потоков. – svick
@svick Почему бы не 200 медленных соединений быть в 40 раз лучше, чем 5 медленных соединений для IO связанных вычислений? Я вижу, что сейчас он обрабатывает 40 пучков из 5 операций, что будет лучше обслуживать 1 пучок из 200 операций. Или я чего-то не хватает? – nicolas