Очередь задач с ограничением числа исполняемых одновременно
От: 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>Тебе даже непонятно, почему это крайне плохая идея?


Ты утверждаешь, ты и должен объяснять. И немного корону поправь. А то она у тебя на уши съезжает.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Очередь задач с ограничением числа исполняемых одновременно
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.12.24 17:06
Оценка: 1 (1) +2 -2 :)
Здравствуйте, Codealot, Вы писали:

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

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

Автор темы ушел на неделю в бан. Приходя на форум с вопросами нужно уважительно относиться к коллегам.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Очередь задач с ограничением числа исполняемых одновременно
От: Codealot Земля  
Дата: 13.12.24 23:13
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Ты утверждаешь, ты и должен объяснять.


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

VD>И немного корону поправь. А то она у тебя на уши съезжает.


Вернемся немного назад. Я задал вопрос о готовой реализации для этой задачи. Каковая задача совершенно нетривиальна, если делать ее с умом.
Вместо этого, Pzz и ты начали придумывать отсебятину, которая по вашему мнению должна быть ничем не хуже. Крайне примитивную и дубовую отсебятину. И теперь ты возмущаешься, почему я не согласен, что ваша отсебятина — лучше не бывает, и никакие готовые решения не нужны.
Так что ты там про корону писал?
Ад пуст, все бесы здесь.
Re[7]: Очередь задач с ограничением числа исполняемых одновр
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.12.24 23:47
Оценка: +1
Здравствуйте, Codealot, Вы писали:

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


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

Правильно поставленный вопрос — это половина ответа. ©

Разных подходов много. Дотнетный пул и так автоматически загружает все доступные процессоры. Рассуждения о Work stealing тут не о чем.

C>Вернемся немного назад.


ОК

C>Я задал вопрос о готовой реализации для этой задачи.


Ты описал крайне абстрактную задачу без каких либо подробностей:

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


Тебе резонно ответили, что в такой постановке вопроса задача выеденного яйца не стоит:

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


На что ты сразу же ответил хамством:

https://rsdn.org/forum/dotnet/8860126.1

Тебе попытались что-то объяснить, но тщетно. Ты начал здесь хамить уже с квантором всеобщности.
После чего я счел тебя невменяемым и дал время на приход в себя.

Баны у нас квадратичные. Так что ты улетел сразу на неделю.

C> Каковая задача совершенно нетривиальна, если делать ее с умом.


Возможно. Но её нетривиальность нужно объяснить. Составить требования (т.з.), в которых описать все необходимые нюансы.

Форумчане не знаю делаешь ли ты какую-то отдельную утилиту или часть в большой многопоточной системе. Не знают, что за данные обрабатываются. Каковы конечные цели.

C>Вместо этого, Pzz и ты начали придумывать отсебятину, которая по вашему мнению должна быть ничем не хуже. Крайне примитивную и дубовую отсебятину. И теперь ты возмущаешься, почему я не согласен, что ваша отсебятина — лучше не бывает, и никакие готовые решения не нужны.

C>Так что ты там про корону писал?

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

Ты вместо того, чтобы понять, что описал задачу слишком поверхностно, начал хамить. Если бы ты в ответ на замечание Pzz объяснил бы в чем сложность, был бы конструктивный разговор. Ты пришел спрашивать. Если тебе не нравится ответ, просто пойди мимо или культурно объясни, что тебя не устраивает. А когда начинаешь тут говорить, что "здесь все шибко умные, а все программы говно", то не обессудь.

А вот это мы здесь допускать не будем. (ц)
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Отредактировано 17.12.2024 23:42 VladD2 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.