|
Многопоточная очередь задач
|
|||
---|---|---|---|
#18+
Приветы, как организовать следующее с использованием TPL? Периодически возникают задачи (можно сказать, есть Concurrent-коллекция, где лежат названия файлов для обработки). Их нужно параллельно выполнять (т.е. запускать их обработку). Как? Если на появление каждой новой записи в очереди запускать Task, их скоро будет сотни, надо чтобы параллельно выполнялось не более N потоков (где N определяется ОС, как оптимальное, в зависимости от числа ядер и пр.). То есть, как один из потоков выполнил задачу, берется из очереди на выполнение новый элемент. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2014, 16:13 |
|
Многопоточная очередь задач
|
|||
---|---|---|---|
#18+
TimeCoder, класс Task использует потоки из ThreadPool в котором есть ограничение на максимальное кол-во потоков и реализована очередь. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2014, 20:19 |
|
Многопоточная очередь задач
|
|||
---|---|---|---|
#18+
bazile, т.е. можно спокойно на каждую новую порцию данных вызывать Task.Factory.StartNew, и автоматически выстроится очередь задач на конвейер с оптимальным числом потоков? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2014, 20:40 |
|
Многопоточная очередь задач
|
|||
---|---|---|---|
#18+
TimeCoderConcurrent-коллекция, где лежат названия файлов для обработки 1) Файлы, если они лежат не на разных дисках, не стоит обрабатывать в многопоточном режиме. 2) Parallel.ForEach вместо StartNew и иже с ним ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2014, 21:23 |
|
Многопоточная очередь задач
|
|||
---|---|---|---|
#18+
TimeCoder, почитай как работает ThreadPool . Всё зависит от того насколько часто ты просишь ThreadPool сделать работу и насколько быстро её заканчиваешь. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2014, 21:49 |
|
Многопоточная очередь задач
|
|||
---|---|---|---|
#18+
Arm79Файлы, если они лежат не на разных дисках, не стоит обрабатывать в многопоточном режиме. Я не согласен с такой категоричной формулировкой. Всё зависит от размера обрабатываемых файлов и природы этой обработки. TimeCoder, в чём Arm79 прав так это что тебе следует задуматься об оптимальной нагрузке на диск, а не процессор. Потому что именно диск будет узким местом. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2014, 21:55 |
|
Многопоточная очередь задач
|
|||
---|---|---|---|
#18+
Ну, мы же в общем случае не знаем, что за там диск. Если это сервер с хорошим ssd? Задача ведь типичная, у того же ютуба, файловых серверов и любых облачных решений ежесекундно происходит загрузка огромного количества файлов, с их последующей обработкой - неужели это происходит в одном потоке последовательно? Очевидно, нет, как-то разбивают. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2014, 23:23 |
|
Многопоточная очередь задач
|
|||
---|---|---|---|
#18+
TimeCoder, Ну вам же сказали, обратить внимание на реализацию общую и реализацию кванта задачи. чо тут не понять, при "умелой" реализации вы получите в лучшем случае жопу с памятью, в худшем дефицит адресного пространства ( особенно на 32) и как следствии - outofmemoryexception ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2014, 00:23 |
|
Многопоточная очередь задач
|
|||
---|---|---|---|
#18+
TimeCoder, любой, даже самый быстрый диск, можно завалить запросами так что он не будет справляться. Если ты пишешь общее решение, то тебе нужен свой thread pool который будет подстраиваться под загрузку диска. Потому что стандартный ThreadPool пытается оптимизировать нагрузку на CPU и избежать создания лишних потоков. Более того в нем рекомендуется запускать короткие неблокирующие задачи. Ввод/вывод к таким задачам не относится и ты рискуешь попасть в ситуацию когда большинство потоков в ThreadPool будут "спать" в ожидании завершения операции ввода/вывода. Решения подобные youtube не пишутся с бухты барахты, а тщательно проектируются на всех уровнях. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2014, 00:27 |
|
Многопоточная очередь задач
|
|||
---|---|---|---|
#18+
Код: c# 1. 2. 3. 4. 5. 6.
так? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2014, 03:31 |
|
Многопоточная очередь задач
|
|||
---|---|---|---|
#18+
gandjustas, нет, здесь набор файлов зафиксирован, а в моем случае он меняется. То есть files - это ConcurrentQueue, где периодически появляются новый файлы (а обработанные оттуда вычеркиваются). ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2014, 06:45 |
|
Многопоточная очередь задач
|
|||
---|---|---|---|
#18+
bazile, это понятно, что проектируются тщательно) Если же говорить о простом решении, достаточном для начала, я выбрал такое: просто создавать на возникающие задачи Task'и через TaskFactory, поскольку внутри там используется ThreadPool, хотя бы некоторая диспетчеризация потоков уже будет. Как рулить пулом задач в зависимости от загрузки диска - это, думаю, задачка не тривиальная. Переопределить TaskScheduler и получить от системы загрузку диска несложно, хитрости в создании наиболее эффективного алгоритма, использующего эти данные для управления потоками. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2014, 08:47 |
|
Многопоточная очередь задач
|
|||
---|---|---|---|
#18+
bazileArm79Файлы, если они лежат не на разных дисках, не стоит обрабатывать в многопоточном режиме. Я не согласен с такой категоричной формулировкой. Всё зависит от размера обрабатываемых файлов и природы этой обработки. +1 Чтение из файла может занимать 1% от всего времени "обработки". Остальные 99% времени (обращение к БД, парсинг данных, обновление в БД и тому подобное) отлично лягут в многопоточную "обработку файла". Так не проще ли параллелить все 100%? Другое дело, распараллеливание просто чтения файлов с одного диска мало эффективно, но всё-равно тут прямая зависимость от их размера. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2014, 09:35 |
|
Многопоточная очередь задач
|
|||
---|---|---|---|
#18+
TimeCoder, 1) Каков размер обрабатываемых файлов? 2) Лежат ли они на одном диске? 3) В чем заключается обработка файлов и как долго она длится? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2014, 11:13 |
|
Многопоточная очередь задач
|
|||
---|---|---|---|
#18+
Arm79, 1. Порядка мегабайт. 2. Скорее всего на одном диске. 3. Индексация (для последующего поиска). ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2014, 11:44 |
|
Многопоточная очередь задач
|
|||
---|---|---|---|
#18+
TimeCoderArm79, 1. Порядка мегабайт. 2. Скорее всего на одном диске. 3. Индексация (для последующего поиска). А сколько по времени длится индексация файла? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2014, 12:05 |
|
Многопоточная очередь задач
|
|||
---|---|---|---|
#18+
Arm79, несколько секунд, но это сейчас, по мере появления более сложных алгоритмов лексического анализа время может увеличиться. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2014, 12:10 |
|
Многопоточная очередь задач
|
|||
---|---|---|---|
#18+
ЕвгенийВ, это как саму очередь построить, но там нет работы с пулом потоков. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2014, 13:08 |
|
Многопоточная очередь задач
|
|||
---|---|---|---|
#18+
TimeCoderArm79, несколько секунд, но это сейчас, по мере появления более сложных алгоритмов лексического анализа время может увеличиться. Тогда да, имеет смысл немного распараллелить. Насколько я понимаю, достаточно запускать Task-и на каждый считанный файл и не беспокоиться о количестве потоков. Один поток мониторит очередь файлов, считывает очередной файл и делает Task на его обработку. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2014, 13:53 |
|
Многопоточная очередь задач
|
|||
---|---|---|---|
#18+
Arm79, ага, я примерно так и сделал. Всем спасибо за советы! ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2014, 13:55 |
|
Многопоточная очередь задач
|
|||
---|---|---|---|
#18+
Arm79Один поток мониторит очередь файлов, считывает очередной файл и делает Task на его обработку Под считывает я имел ввиду не имя файла, а его содержимое :-) Считали в буфер памяти и передали ссылку на этот буфер таску. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2014, 14:10 |
|
Многопоточная очередь задач
|
|||
---|---|---|---|
#18+
1. Очередь с блокировкой 2. Поток читает файл и пихает в очередь по одному, если несколько источников - можно поэксперементировать, поток на каждый источник, каждый поток пихает в очередь 3. Поток на обработку очередного файла из очереди, натравливаешь на очередь, увеличиваешь кол-во потоков до N Примечания: * методы в п.2 и п.3. сами по себе должны быть потокобезопасными, не использовать других разделяемых ресурсов, единственным таким ресурсом должна быть только очередь * если очень надо - оборачиваешь п.1-3 в отдельный блок и делаешь несколько потоков на запуск нескольких таких блоков, только на вход в каждый блок надо подавать непересекающиеся списки источников ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2014, 15:58 |
|
Многопоточная очередь задач
|
|||
---|---|---|---|
#18+
TimeCodergandjustas, нет, здесь набор файлов зафиксирован, а в моем случае он меняется. То есть files - это ConcurrentQueue, где периодически появляются новый файлы (а обработанные оттуда вычеркиваются). Посмотри на TPL Dataflow, как раз твою проблему решает. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2014, 17:10 |
|
|
start [/forum/topic.php?fid=20&msg=38739913&tid=1402500]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
101ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
others: | 331ms |
total: | 530ms |
0 / 0 |