A>Одним потоком через new Thread живущий на протяжении работы приложения бегаем по базе/очереди и получаем данные для дальнейшей обработки. A>Далее через Task.Factory.StartNew запускаем таски для выполнения полезных действий. A>Лимитируем все это семафором
Если да, то скорость генерации данных как-то лимитируется?
Потому что если нет, есть риск получить классический over-subscription:
данных поступает все больше и больше (при фиксированной скорости потребления).
ThredPool начинает наращивать количество тредов. А данных все больше и больше
Пул растет как бешеный. В итоге все время тратится на переключение контекстов вместо реальной работы.
Здравствуйте, alexsoff, Вы писали:
A> Приветствую. A>Вопрос по архитектуре и грамотному использованию ресурсов.
Я делаю как можно проще и смотрю как оно работает: http://rsdn.org/forum/dotnet/6436611.1
плюс еще счетчик и буферизация(x*2) заданий. Если счетчик превысит 2x, читающий/создающий новые задачи поток блокируется, до того, как будет буфер опустошен до половины.
RD>Если да, то скорость генерации данных как-то лимитируется?
лимитируется как раз скорость потребления.
Здравствуйте, alexsoff, Вы писали:
A>Здравствуйте, RushDevion, Вы писали:
RD>>Ну либо я не вполне уловил детали твоей реализации A>Одним потоком через new Thread живущий на протяжении работы приложения бегаем по базе/очереди и получаем данные для дальнейшей обработки. A>Далее через Task.Factory.StartNew запускаем таски для выполнения полезных действий. A>Лимитируем все это семафором
А почему не используется готовый ActionBlock из пакета Tpl.Dataflow?
Тот, кто бегает по очереди/базе просто создаёт ActionBlock с соответствующими MaxDegreeOfParallelism и BoundedCapacity и помещает элементы в очередь.
Какой-то недостаток имеется или просто самому тасками рулить привычнее?
смотри AsyncProducerConsumerCollection и метод Add
Что бы обойтись без объектов синхронизации можно сделать 2 очереди
1. Очередь задач на выполнение, где можно регулировать в зависимости от максимальной длины очереди
2. Очередь свободны задач.
for(var i=1; i<MaxCountTask; i++)
queueFreeTask.Add(1);
while(true)
{
Action act= await queue1.Take(); // возьмем метод на выполнение из первой очереди
/// Посмотрим есть ли свободные задачиvar i= await queueFreeTask.Take();
Task.Run(() => act(); queueFreeTask.Add(1); ); // выполнимм задачу и добавим признак свободной задачи в очередь
}
Писал без студии
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, AndrewVK, Вы писали: AVK>А зачем тебе такой таск? БД IOCP не поддерживает?
Операции/данные из разных источников — одни поддерживают, другие нет. Увы, мир не идеален
Здравствуйте, alexsoff, Вы писали:
AVK>>А зачем тебе такой таск? БД IOCP не поддерживает? A>Операции/данные из разных источников — одни поддерживают, другие нет. Увы, мир не идеален
Все источники внутри компа в итоге сводятся к внешним интерфейсам — сетевые карты и носители в основном. А они все умеют IOCP.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>