2013-09-17 3 views
1

Как я понимаю, API параллелирования использует пул потоков внутри, и они ставят в очередь элементы для параллельной обработки, однако, когда я проверил выполнение одного такого параллельного цикла с использованием отладчика SOS, тогда я понимаю, что если у меня будет 10 заданных задач, то все они могут не идти параллельно, и CLR будет решать, сколько потоков для отправки для выполнения заданных задач, так что это может быть 4 или 5 или 6 (различное число в каждое исполнение).Net Parallel, Task APIs Vs regular Threads

Однако в случае, если мой общий номер задачи, если не очень высокий, как 10, и я хочу, чтобы все они проходили параллельно, поскольку все они длинные, желательно, чтобы они были на традиционных потоках, который обеспечит 1 поток на одну задачу, и все они идут параллельно. В случае, если число t запрашивает хорошее число, например, 100, тогда использование Parallel или Threadpool является практическим решением, так как мы не хотим вызывать 100 отдельных потоков в процессе.

Пожалуйста, поделитесь своим мнением, я понимаю, что преимущества Parallel API делают полное параллельное программирование очень легко реализовать, но здесь моя цель другая

+0

Просто используйте TPL. Это довольно открытый субъективный вопрос, вы четко не указываете, какова ваша цель, и делаете некоторые несвязанные предположения в вопросе. «Регулярные потоки» не являются магии, они все равно будут сконфигурированы как физическое оборудование и операционная система. – Jodrell

+0

@Jodrell: Threads использует упреждающий выбор времени, позволяя любому числу работать параллельно (с увеличением накладных расходов). Без опции «LongRunning» TPL будет неприемлемым для сценариев, требующих одновременного активирования многих задач (даже если это практически так). – Douglas

+0

@ Douglas, это зависит от того, что означает OP при длительном запуске. В любом случае, вам нужно использовать TPL. Если работа «Long Running», то ваш ответ, который я уже поддержал, применяется красиво. Если я создам 1000 «Regular Threads», они будут работать так же плохо, как 1000 'LongRunning' TPL' Tasks'. – Jodrell

ответ

6

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

Вы правы, желая, чтобы ваши длительные задачи выполнялись одновременно через перенаправление пересылки (т. Е. Выполнялось несколько потоков на каждое логическое ядро). На самом деле инфраструктура библиотеки параллельной библиотеки задач (TPL) специально предназначена для этого сценария через опцию LongRunning, которая (в рамках текущей реализации) порождает новый выделенный поток для каждой заданной таким образом задачи.

Task.Factory.StartNew(myLongRunningAction, TaskCreationOptions.LongRunning);