стоимость Async.Start - PullRequest
       21

стоимость Async.Start

1 голос
/ 02 апреля 2012

В цикле почтового ящика я читаю из блокирующих элементов коллекции, ранее сохраненных в такой коллекции.Поскольку я использую один и тот же цикл для записи в такую ​​коллекцию, мне нужно запустить его как поток.

async { process(queue.Take()) } |> Aysync.Start

Выполнение всего моего кода происходит медленно (условно говоря), и я подозреваю, что причина в новойпоток, который я запускаю, хотя я запускал пул потоков с помощью

let toto = ThreadPool.SetMinThreads(300,300)

Еще один намек на то, что здесь может возникнуть спор, что если я запускаю только, когда очередь пуста (и блокирую весь раздел), явремя выполнения сильно варьируется, от 350 мс до 7 с, а если нет, то остается около 5–10 с.потоков здесь

Есть ли какая-то структура, которая уже занимается такой ситуацией (потребитель / производитель?), которую можно использовать внутри процессора почтовых ящиков?

1 Ответ

1 голос
/ 02 апреля 2012

Если вам нужно создать сотни потоков для выполнения вычислений, связанных с вводом / выводом, то, вероятно, что-то не так.Если вычисление связано с вводом / выводом, то должно быть возможно выполнить его с использованием относительно небольшого числа потоков - если оно полностью асинхронно , это означает, что потоки не будут блокироваться во время ожидания.

Итак, я думаю, что первое, что нужно искать в вашей программе - это места, где поток заблокирован, и замените его асинхронным ожиданием.

Одна подозрительная вещь в вашем примере кода - это очередь, которая, вероятно, блокируется, когда вы вызываете Take, по крайней мере, так ведет себя BlockingCollection в .NET.Вы можете попробовать заменить его на BlockingQueueAgent, который реализует ту же функциональность с использованием агентов F #, но предоставляет асинхронный метод AsyncTake, который можно вызывать без блокировки потока.

...