Re[13]: много Thread или ThreadPool
От: RushDevion Россия  
Дата: 23.02.18 19:53
Оценка:
A>Одним потоком через new Thread живущий на протяжении работы приложения бегаем по базе/очереди и получаем данные для дальнейшей обработки.
A>Далее через Task.Factory.StartNew запускаем таски для выполнения полезных действий.
A>Лимитируем все это семафором

Че-т все равно смутно.
Что то типа такого?
while(true) {
  var workItem = getWorkItem();
  Task.Factory.StartNew(()=>{
    m_Semaphore.WaitOne();
    // Proces...
    m_Semaphore.Release();
  });
}

Если да, то скорость генерации данных как-то лимитируется?
Потому что если нет, есть риск получить классический over-subscription:
данных поступает все больше и больше (при фиксированной скорости потребления).
ThredPool начинает наращивать количество тредов. А данных все больше и больше
Пул растет как бешеный. В итоге все время тратится на переключение контекстов вместо реальной работы.
Re: много Thread или ThreadPool
От: Vladek Россия Github
Дата: 23.02.18 21:48
Оценка: 2 (1)
Здравствуйте, alexsoff, Вы писали:

A> Приветствую.

A>Вопрос по архитектуре и грамотному использованию ресурсов.
Я делаю как можно проще и смотрю как оно работает: http://rsdn.org/forum/dotnet/6436611.1
Автор: Vladek
Дата: 05.05.16

Обычно всё и так работает удовлетворительно или узкие места оказываются не там, где предполагал изначально.
Re[14]: много Thread или ThreadPool
От: alexsoff Россия  
Дата: 24.02.18 04:48
Оценка:
Здравствуйте, RushDevion, Вы писали:

RD>Че-т все равно смутно.

RD>Что то типа такого?
RD>
RD>while(true) {
RD>  var workItem = getWorkItem();
RD>  Task.Factory.StartNew(()=>{
RD>    m_Semaphore.WaitOne();
RD>    // Proces...
RD>    m_Semaphore.Release();
RD>  });
RD>}
RD>


плюс еще счетчик и буферизация(x*2) заданий. Если счетчик превысит 2x, читающий/создающий новые задачи поток блокируется, до того, как будет буфер опустошен до половины.

RD>Если да, то скорость генерации данных как-то лимитируется?

лимитируется как раз скорость потребления.
Re[13]: много Thread или ThreadPool
От: karbofos42 Россия  
Дата: 24.02.18 07:52
Оценка:
Здравствуйте, alexsoff, Вы писали:

A>Здравствуйте, RushDevion, Вы писали:


RD>>Ну либо я не вполне уловил детали твоей реализации

A>Одним потоком через new Thread живущий на протяжении работы приложения бегаем по базе/очереди и получаем данные для дальнейшей обработки.
A>Далее через Task.Factory.StartNew запускаем таски для выполнения полезных действий.
A>Лимитируем все это семафором

А почему не используется готовый ActionBlock из пакета Tpl.Dataflow?
Тот, кто бегает по очереди/базе просто создаёт ActionBlock с соответствующими MaxDegreeOfParallelism и BoundedCapacity и помещает элементы в очередь.
Какой-то недостаток имеется или просто самому тасками рулить привычнее?
Re[15]: много Thread или ThreadPool
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 24.02.18 08:02
Оценка: 2 (1)
Здравствуйте, alexsoff, Вы писали:

RD>>Если да, то скорость генерации данных как-то лимитируется?

A>лимитируется как раз скорость потребления.

Если хочешь свой шедулер, то посмотри на асинхронную очеред
https://docs.microsoft.com/ru-ru/dotnet/standard/asynchronous-programming-patterns/consuming-the-task-based-asynchronous-pattern

смотри 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); ); // выполнимм задачу и добавим признак свободной задачи в очередь
}

Писал без студии
и солнце б утром не вставало, когда бы не было меня
Отредактировано 24.02.2018 9:59 Serginio1 . Предыдущая версия .
Re[3]: много Thread или ThreadPool
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 24.02.18 11:07
Оценка:
Здравствуйте, alexsoff, Вы писали:

A>нуу, Task с временем жизни приложения это разве не изврат?


А зачем тебе такой таск? БД IOCP не поддерживает?
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Re[14]: много Thread или ThreadPool
От: alexsoff Россия  
Дата: 24.02.18 11:13
Оценка:
Здравствуйте, karbofos42, Вы писали:


K>А почему не используется готовый ActionBlock из пакета Tpl.Dataflow?

не нравится одним:
https://www.nuget.org/packages/Microsoft.Tpl.Dataflow/

Last updated
12/10/2014

Re[4]: много Thread или ThreadPool
От: alexsoff Россия  
Дата: 24.02.18 11:17
Оценка:
Здравствуйте, AndrewVK, Вы писали:
AVK>А зачем тебе такой таск? БД IOCP не поддерживает?
Операции/данные из разных источников — одни поддерживают, другие нет. Увы, мир не идеален
Re[5]: много Thread или ThreadPool
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 24.02.18 11:37
Оценка:
Здравствуйте, alexsoff, Вы писали:

AVK>>А зачем тебе такой таск? БД IOCP не поддерживает?

A>Операции/данные из разных источников — одни поддерживают, другие нет. Увы, мир не идеален

Все источники внутри компа в итоге сводятся к внешним интерфейсам — сетевые карты и носители в основном. А они все умеют IOCP.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Re[14]: много Thread или ThreadPool
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 24.02.18 11:40
Оценка:
Здравствуйте, RushDevion, Вы писали:

RD>Пул растет как бешеный. В итоге все время тратится на переключение контекстов вместо реальной работы.


У пула есть ограничение на количество потоков, причем довольно скромное по умолчанию (25 на ядро, емнип).
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Re[15]: много Thread или ThreadPool
От: sergeya Ниоткуда http://blogtani.ru
Дата: 26.02.18 13:37
Оценка:
Здравствуйте, alexsoff, Вы писали:

A>https://www.nuget.org/packages/Microsoft.Tpl.Dataflow/

A>

A>Last updated
A>12/10/2014


Здесь — https://www.nuget.org/packages/System.Threading.Tasks.Dataflow/

Version: 4.8.0
Last updated: 6 months ago

Мобильная версия сайта RSDN — http://rsdn.org/forum/rsdn/6938747
Автор: sergeya
Дата: 19.10.17
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.