Очередь задач с ограничением числа исполняемых одновременно
От: Codealot Земля  
Дата: 30.11.24 20:32
Оценка: 3 (1)
Нужно в цикле извлекать из очереди задачи и выполнять параллельно, но не больше N задач одновременно. И нужно добавлять новые задачи в хвост очереди.
Есть готовые решения?
Ад пуст, все бесы здесь.
Re: Очередь задач с ограничением числа исполняемых одновременно
От: Pzz Россия https://github.com/alexpevzner
Дата: 30.11.24 21:31
Оценка: +3 -2 :)
Здравствуйте, Codealot, Вы писали:

C>Нужно в цикле извлекать из очереди задачи и выполнять параллельно, но не больше N задач одновременно. И нужно добавлять новые задачи в хвост очереди.

C>Есть готовые решения?

Неужели это требует больше 50-и строк кода? Неужели в современном мире написать 50 строк кода считается настолько греховным занятием, что избежание оного оправдывает усилия на поиск готового решения?
Re: Очередь задач с ограничением числа исполняемых одновременно
От: karbofos42 Россия  
Дата: 30.11.24 21:55
Оценка: 9 (1) +1
Здравствуйте, Codealot, Вы писали:

C>Нужно в цикле извлекать из очереди задачи и выполнять параллельно, но не больше N задач одновременно. И нужно добавлять новые задачи в хвост очереди.

C>Есть готовые решения?

ActionBlock в Dataflow есть: https://learn.microsoft.com/en-us/dotnet/standard/parallel-programming/how-to-specify-the-degree-of-parallelism-in-a-dataflow-block
Re: Очередь задач с ограничением числа исполняемых одновременно
От: RushDevion Россия  
Дата: 01.12.24 13:34
Оценка: 21 (2) +2 -1 :)
C>Есть готовые решения?

BlockingCollection + N long running Tasks, которые через GetConsumingEnumerable() из нее читают.
Re: Очередь задач с ограничением числа исполняемых одновременно
От: Буравчик Россия  
Дата: 01.12.24 14:02
Оценка:
Здравствуйте, Codealot, Вы писали:

C>Нужно в цикле извлекать из очереди задачи и выполнять параллельно, но не больше N задач одновременно. И нужно добавлять новые задачи в хвост очереди.

C>Есть готовые решения?

Зависит от требований. Давай детали

Число N какого порядка?
Можно ли заблочить добавление задач в очередь, т.е. не добавлять если все обработчки заняты?
Все задачи живут в RAM?
Что должно произойти с задачей, если ее не удалось обработать, или вообще при полном отказе (например, перезагрузка приложения)?
Best regards, Буравчик
Re: Очередь задач с ограничением числа исполняемых одновременно
От: Janus Россия  
Дата: 01.12.24 16:40
Оценка:
Здравствуйте, Codealot, Вы писали:

C>Нужно в цикле извлекать из очереди задачи и выполнять параллельно, но не больше N задач одновременно. И нужно добавлять новые задачи в хвост очереди.

C>Есть готовые решения?

подойдет как пример ? TaskScheduler
... Хорошо уметь читать между строк. Это иногда
приносит большую пользу
Re[2]: Очередь задач с ограничением числа исполняемых одновременно
От: Codealot Земля  
Дата: 01.12.24 18:52
Оценка:
Здравствуйте, Буравчик, Вы писали:

Б>Число N какого порядка?


Десятки.

Б>Можно ли заблочить добавление задач в очередь, т.е. не добавлять если все обработчки заняты?


Не нужно.

Б>Все задачи живут в RAM?


Да.

Б>Что должно произойти с задачей, если ее не удалось обработать


Удалить из очереди, записать ошибку.

Б>или вообще при полном отказе (например, перезагрузка приложения)?


Если приложение закрывается аварийно, можно просто обнулить очередь. Но при нормальной работе, должна быть возможность дождаться полного окончания всех задач.
Ад пуст, все бесы здесь.
Re: Очередь задач с ограничением числа исполняемых одновременно
От: Teolog  
Дата: 01.12.24 19:02
Оценка: :)
Здравствуйте, Codealot, Вы писали:

C>Нужно в цикле извлекать из очереди задачи и выполнять параллельно, но не больше N задач одновременно. И нужно добавлять новые задачи в хвост очереди.

C>Есть готовые решения?
Это викторина?
Тогда ответ "task pool".
Re[3]: Очередь задач с ограничением числа исполняемых одновременно
От: Буравчик Россия  
Дата: 01.12.24 20:14
Оценка: +1
Здравствуйте, Codealot, Вы писали:

Б>>Все задачи живут в RAM?

C>Да.

Тогда BlockingCollection
https://learn.microsoft.com/ru-ru/dotnet/standard/collections/thread-safe/blockingcollection-overview
Best regards, Буравчик
Re[4]: Очередь задач с ограничением числа исполняемых одновременно
От: Codealot Земля  
Дата: 01.12.24 20:36
Оценка: -1 :)
Здравствуйте, Буравчик, Вы писали:

Б>Тогда BlockingCollection


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

Не годится.
Ад пуст, все бесы здесь.
Re: Очередь задач с ограничением числа исполняемых одновременно
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 01.12.24 20:48
Оценка: 3 (1)
Здравствуйте, Codealot, Вы писали:

C>Нужно в цикле извлекать из очереди задачи и выполнять параллельно, но не больше N задач одновременно. И нужно добавлять новые задачи в хвост очереди.

C>Есть готовые решения?
https://learn.microsoft.com/en-us/dotnet/api/system.threading.channels
Re[5]: Очередь задач с ограничением числа исполняемых одновременно
От: Буравчик Россия  
Дата: 01.12.24 21:14
Оценка: -1
Здравствуйте, Codealot, Вы писали:

C>

C>Если коллекция достигает максимальной емкости, то потоки-создатели перейдут в состояние блокировки, пока не будет удален хотя бы один элемент.

C>Не годится.

Внимательнее читай доку.

BlockingCollection<T>() — Инициализирует новый экземпляр класса BlockingCollection<T> без верхней границы.

Best regards, Буравчик
Re[6]: Очередь задач с ограничением числа исполняемых одновременно
От: Codealot Земля  
Дата: 01.12.24 23:53
Оценка:
Здравствуйте, Буравчик, Вы писали:

То есть треды-потребители нужно делать самому, и понятного нет никакого work stealing.
Ад пуст, все бесы здесь.
Re: Очередь задач с ограничением числа исполняемых одновременно
От: VladD2 Российская Империя www.nemerle.org
Дата: 02.12.24 17:08
Оценка:
Здравствуйте, Codealot, Вы писали:

C>Нужно в цикле извлекать из очереди задачи и выполнять параллельно, но не больше N задач одновременно. И нужно добавлять новые задачи в хвост очереди.

C>Есть готовые решения?

Гугл подсказывает, что возможно вот это тебе подойдет.

Если это ограничение на приложение, можно просто задать максимальное число параллельно выполняемых потоков в основном пуле через ThreadPool.SetMaxThreads.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Очередь задач с ограничением числа исполняемых одновременно
От: Codealot Земля  
Дата: 02.12.24 18:22
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Гугл подсказывает, что возможно вот это тебе подойдет.


В качественной реализации, как мне видится, должен быть work stealing.

VD>Если это ограничение на приложение, можно просто задать максимальное число параллельно выполняемых потоков в основном пуле


Вообще никуда не годится.
Ад пуст, все бесы здесь.
Re[3]: Очередь задач с ограничением числа исполняемых одновр
От: RushDevion Россия  
Дата: 02.12.24 18:52
Оценка:
C>В качественной реализации, как мне видится, должен быть work stealing.
И работать он судя по вот этому
C> Желательно исполнять задачи в том же треде, который добавил их в очередь.
должен по алгоритму thread spizding'a...
Отредактировано 02.12.2024 18:53 RushDevion . Предыдущая версия .
Re: Очередь задач с ограничением числа исполняемых одновременно
От: _NN_ www.nemerleweb.com
Дата: 03.12.24 08:28
Оценка:
Здравствуйте, Codealot, Вы писали:

C>Нужно в цикле извлекать из очереди задачи и выполнять параллельно, но не больше N задач одновременно. И нужно добавлять новые задачи в хвост очереди.

C>Есть готовые решения?

Могу добавить ещё вариант через Rx.NET.
Или если есть желание кинуть на свой пул потоков: https://www.codeproject.com/Articles/7933/Smart-Thread-Pool
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: Очередь задач с ограничением числа исполняемых одновременно
От: VladD2 Российская Империя www.nemerle.org
Дата: 03.12.24 11:31
Оценка: 1 (1)
Здравствуйте, Codealot, Вы писали:

C>В качественной реализации, как мне видится, должен быть work stealing.


Так ты объясни, что ты под этим понимаешь, и зачем это нужно. В теме у тебя ничего про это нет.

C>Вообще никуда не годится.


Опять же нужно объяснять почему. Пока что ты демонстрируешь неумение грамотно ставить задачу.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Очередь задач с ограничением числа исполняемых одновременно
От: Codealot Земля  
Дата: 03.12.24 17:20
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Так ты объясни, что ты под этим понимаешь, и зачем это нужно. В теме у тебя ничего про это нет.


А ты сам не в состоянии понять даже с подсказкой?
Например, можно сделать у каждого рабочего треда свою очередь, из которой он извлекает задачи и может добавлять новые. Если в своей очереди ничего нет, можно забрать часть задач у другого треда.

VD>Опять же нужно объяснять почему.


Тебе даже непонятно, почему это крайне плохая идея?
Ад пуст, все бесы здесь.
Re[5]: Очередь задач с ограничением числа исполняемых одновременно
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.12.24 16:55
Оценка: -1 :)
Здравствуйте, Codealot, Вы писали:

C>А ты сам не в состоянии понять даже с подсказкой?


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

C>Например, можно сделать у каждого рабочего треда свою очередь, из которой он извлекает задачи и может добавлять новые. Если в своей очереди ничего нет, можно забрать часть задач у другого треда.


Ничего этого в постановке задачи не было. Так что можно констатировать факт — ты не умеешь ставить задачи. А вместо того чтобы учиться это делать, хамишь.

C>Тебе даже непонятно, почему это крайне плохая идея?


Ты утверждаешь, ты и должен объяснять. И немного корону поправь. А то она у тебя на уши съезжает.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.