powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Многопоточная очередь задач
24 сообщений из 24, страница 1 из 1
Многопоточная очередь задач
    #38739814
TimeCoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветы,
как организовать следующее с использованием TPL?

Периодически возникают задачи (можно сказать, есть Concurrent-коллекция, где лежат названия файлов для обработки). Их нужно параллельно выполнять (т.е. запускать их обработку). Как? Если на появление каждой новой записи в очереди запускать Task, их скоро будет сотни, надо чтобы параллельно выполнялось не более N потоков (где N определяется ОС, как оптимальное, в зависимости от числа ядер и пр.). То есть, как один из потоков выполнил задачу, берется из очереди на выполнение новый элемент.
...
Рейтинг: 0 / 0
Многопоточная очередь задач
    #38739913
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimeCoder, класс Task использует потоки из ThreadPool в котором есть ограничение на максимальное кол-во потоков и реализована очередь.
...
Рейтинг: 0 / 0
Многопоточная очередь задач
    #38739932
TimeCoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bazile,
т.е. можно спокойно на каждую новую порцию данных вызывать Task.Factory.StartNew, и автоматически выстроится очередь задач на конвейер с оптимальным числом потоков?
...
Рейтинг: 0 / 0
Многопоточная очередь задач
    #38739959
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimeCoderConcurrent-коллекция, где лежат названия файлов для обработки
1) Файлы, если они лежат не на разных дисках, не стоит обрабатывать в многопоточном режиме.
2) Parallel.ForEach вместо StartNew и иже с ним
...
Рейтинг: 0 / 0
Многопоточная очередь задач
    #38739973
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimeCoder, почитай как работает ThreadPool . Всё зависит от того насколько часто ты просишь ThreadPool сделать работу и насколько быстро её заканчиваешь.
...
Рейтинг: 0 / 0
Многопоточная очередь задач
    #38739981
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Файлы, если они лежат не на разных дисках, не стоит обрабатывать в многопоточном режиме.
Я не согласен с такой категоричной формулировкой. Всё зависит от размера обрабатываемых файлов и природы этой обработки.

TimeCoder, в чём Arm79 прав так это что тебе следует задуматься об оптимальной нагрузке на диск, а не процессор. Потому что именно диск будет узким местом.
...
Рейтинг: 0 / 0
Многопоточная очередь задач
    #38740043
TimeCoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну, мы же в общем случае не знаем, что за там диск. Если это сервер с хорошим ssd? Задача ведь типичная, у того же ютуба, файловых серверов и любых облачных решений ежесекундно происходит загрузка огромного количества файлов, с их последующей обработкой - неужели это происходит в одном потоке последовательно? Очевидно, нет, как-то разбивают.
...
Рейтинг: 0 / 0
Многопоточная очередь задач
    #38740067
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimeCoder,
Ну вам же сказали, обратить внимание на реализацию общую и реализацию кванта задачи.
чо тут не понять, при "умелой" реализации вы получите в лучшем случае жопу с памятью, в худшем
дефицит адресного пространства ( особенно на 32) и как следствии - outofmemoryexception
...
Рейтинг: 0 / 0
Многопоточная очередь задач
    #38740072
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimeCoder, любой, даже самый быстрый диск, можно завалить запросами так что он не будет справляться. Если ты пишешь общее решение, то тебе нужен свой thread pool который будет подстраиваться под загрузку диска. Потому что стандартный ThreadPool пытается оптимизировать нагрузку на CPU и избежать создания лишних потоков. Более того в нем рекомендуется запускать короткие неблокирующие задачи. Ввод/вывод к таким задачам не относится и ты рискуешь попасть в ситуацию когда большинство потоков в ThreadPool будут "спать" в ожидании завершения операции ввода/вывода. Решения подобные youtube не пишутся с бухты барахты, а тщательно проектируются на всех уровнях.
...
Рейтинг: 0 / 0
Многопоточная очередь задач
    #38740109
gandjustas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
Task<TResult> ProcessFile(string name)
{
  // some code
}

var tasks = Task.WhenAll(files.Select(ProcessFile).ToArray());



так?
...
Рейтинг: 0 / 0
Многопоточная очередь задач
    #38740129
TimeCoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gandjustas,
нет, здесь набор файлов зафиксирован, а в моем случае он меняется. То есть files - это ConcurrentQueue, где периодически появляются новый файлы (а обработанные оттуда вычеркиваются).
...
Рейтинг: 0 / 0
Многопоточная очередь задач
    #38740159
TimeCoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bazile,
это понятно, что проектируются тщательно) Если же говорить о простом решении, достаточном для начала, я выбрал такое: просто создавать на возникающие задачи Task'и через TaskFactory, поскольку внутри там используется ThreadPool, хотя бы некоторая диспетчеризация потоков уже будет. Как рулить пулом задач в зависимости от загрузки диска - это, думаю, задачка не тривиальная. Переопределить TaskScheduler и получить от системы загрузку диска несложно, хитрости в создании наиболее эффективного алгоритма, использующего эти данные для управления потоками.
...
Рейтинг: 0 / 0
Многопоточная очередь задач
    #38740199
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazileArm79Файлы, если они лежат не на разных дисках, не стоит обрабатывать в многопоточном режиме.
Я не согласен с такой категоричной формулировкой. Всё зависит от размера обрабатываемых файлов и природы этой обработки.
+1

Чтение из файла может занимать 1% от всего времени "обработки". Остальные 99% времени (обращение к БД, парсинг данных, обновление в БД и тому подобное) отлично лягут в многопоточную "обработку файла". Так не проще ли параллелить все 100%? Другое дело, распараллеливание просто чтения файлов с одного диска мало эффективно, но всё-равно тут прямая зависимость от их размера.
...
Рейтинг: 0 / 0
Многопоточная очередь задач
    #38740281
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimeCoder,

1) Каков размер обрабатываемых файлов?
2) Лежат ли они на одном диске?
3) В чем заключается обработка файлов и как долго она длится?
...
Рейтинг: 0 / 0
Многопоточная очередь задач
    #38740336
TimeCoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79,
1. Порядка мегабайт.
2. Скорее всего на одном диске.
3. Индексация (для последующего поиска).
...
Рейтинг: 0 / 0
Многопоточная очередь задач
    #38740362
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimeCoderArm79,
1. Порядка мегабайт.
2. Скорее всего на одном диске.
3. Индексация (для последующего поиска).
А сколько по времени длится индексация файла?
...
Рейтинг: 0 / 0
Многопоточная очередь задач
    #38740369
TimeCoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79,
несколько секунд, но это сейчас, по мере появления более сложных алгоритмов лексического анализа время может увеличиться.
...
Рейтинг: 0 / 0
Многопоточная очередь задач
    #38740441
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Многопоточная очередь задач
    #38740445
TimeCoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЕвгенийВ,
это как саму очередь построить, но там нет работы с пулом потоков.
...
Рейтинг: 0 / 0
Многопоточная очередь задач
    #38740517
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimeCoderArm79,
несколько секунд, но это сейчас, по мере появления более сложных алгоритмов лексического анализа время может увеличиться.
Тогда да, имеет смысл немного распараллелить.

Насколько я понимаю, достаточно запускать Task-и на каждый считанный файл и не беспокоиться о количестве потоков. Один поток мониторит очередь файлов, считывает очередной файл и делает Task на его обработку.
...
Рейтинг: 0 / 0
Многопоточная очередь задач
    #38740524
TimeCoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79,

ага, я примерно так и сделал. Всем спасибо за советы!
...
Рейтинг: 0 / 0
Многопоточная очередь задач
    #38740541
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Один поток мониторит очередь файлов, считывает очередной файл и делает Task на его обработку
Под считывает я имел ввиду не имя файла, а его содержимое :-)
Считали в буфер памяти и передали ссылку на этот буфер таску.
...
Рейтинг: 0 / 0
Многопоточная очередь задач
    #38740736
17-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Очередь с блокировкой
2. Поток читает файл и пихает в очередь по одному, если несколько источников - можно поэксперементировать, поток на каждый источник, каждый поток пихает в очередь
3. Поток на обработку очередного файла из очереди, натравливаешь на очередь, увеличиваешь кол-во потоков до N

Примечания:
* методы в п.2 и п.3. сами по себе должны быть потокобезопасными, не использовать других разделяемых ресурсов, единственным таким ресурсом должна быть только очередь
* если очень надо - оборачиваешь п.1-3 в отдельный блок и делаешь несколько потоков на запуск нескольких таких блоков, только на вход в каждый блок надо подавать непересекающиеся списки источников
...
Рейтинг: 0 / 0
Многопоточная очередь задач
    #38740854
gandjustas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimeCodergandjustas,
нет, здесь набор файлов зафиксирован, а в моем случае он меняется. То есть files - это ConcurrentQueue, где периодически появляются новый файлы (а обработанные оттуда вычеркиваются).

Посмотри на TPL Dataflow, как раз твою проблему решает.
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Многопоточная очередь задач
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]