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

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

TimeCoder, в чём Arm79 прав так это что тебе следует задуматься об оптимальной нагрузке на диск, а не процессор. Потому что именно диск будет узким местом.
...
Рейтинг: 0 / 0
07.09.2014, 23:23
    #38740043
TimeCoder
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточная очередь задач
Ну, мы же в общем случае не знаем, что за там диск. Если это сервер с хорошим ssd? Задача ведь типичная, у того же ютуба, файловых серверов и любых облачных решений ежесекундно происходит загрузка огромного количества файлов, с их последующей обработкой - неужели это происходит в одном потоке последовательно? Очевидно, нет, как-то разбивают.
...
Рейтинг: 0 / 0
08.09.2014, 00:23
    #38740067
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточная очередь задач
TimeCoder,
Ну вам же сказали, обратить внимание на реализацию общую и реализацию кванта задачи.
чо тут не понять, при "умелой" реализации вы получите в лучшем случае жопу с памятью, в худшем
дефицит адресного пространства ( особенно на 32) и как следствии - outofmemoryexception
...
Рейтинг: 0 / 0
08.09.2014, 00:27
    #38740072
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточная очередь задач
TimeCoder, любой, даже самый быстрый диск, можно завалить запросами так что он не будет справляться. Если ты пишешь общее решение, то тебе нужен свой thread pool который будет подстраиваться под загрузку диска. Потому что стандартный ThreadPool пытается оптимизировать нагрузку на CPU и избежать создания лишних потоков. Более того в нем рекомендуется запускать короткие неблокирующие задачи. Ввод/вывод к таким задачам не относится и ты рискуешь попасть в ситуацию когда большинство потоков в ThreadPool будут "спать" в ожидании завершения операции ввода/вывода. Решения подобные youtube не пишутся с бухты барахты, а тщательно проектируются на всех уровнях.
...
Рейтинг: 0 / 0
08.09.2014, 03:31
    #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
08.09.2014, 06:45
    #38740129
TimeCoder
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточная очередь задач
gandjustas,
нет, здесь набор файлов зафиксирован, а в моем случае он меняется. То есть files - это ConcurrentQueue, где периодически появляются новый файлы (а обработанные оттуда вычеркиваются).
...
Рейтинг: 0 / 0
08.09.2014, 08:47
    #38740159
TimeCoder
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточная очередь задач
bazile,
это понятно, что проектируются тщательно) Если же говорить о простом решении, достаточном для начала, я выбрал такое: просто создавать на возникающие задачи Task'и через TaskFactory, поскольку внутри там используется ThreadPool, хотя бы некоторая диспетчеризация потоков уже будет. Как рулить пулом задач в зависимости от загрузки диска - это, думаю, задачка не тривиальная. Переопределить TaskScheduler и получить от системы загрузку диска несложно, хитрости в создании наиболее эффективного алгоритма, использующего эти данные для управления потоками.
...
Рейтинг: 0 / 0
08.09.2014, 09:35
    #38740199
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточная очередь задач
bazileArm79Файлы, если они лежат не на разных дисках, не стоит обрабатывать в многопоточном режиме.
Я не согласен с такой категоричной формулировкой. Всё зависит от размера обрабатываемых файлов и природы этой обработки.
+1

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

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

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

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

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

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


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