Можно ли утверждать что Task автоматически создает пул потоков, а Thread нет ?
Asked
Active
Viewed 679 times
6
-
немного текста от Джона Скита – tym32167 Apr 10 '18 at 10:48
-
1Возможный дубликат вопроса: task и нативный thread – tym32167 Apr 10 '18 at 12:56
-
Прочитайте 1 и 2 главы этого. – Vasek Apr 10 '18 at 14:00
1 Answers
8
Говорить что "Task автоматически создает пул потоков" нельзя, потому что пул потоков есть в рантайме независимо ни от каких Task. И даже говорить что Task использует пул потоков - тоже нельзя, потому что Task может работать в любом планировщике включая самые экзотические.
Однако, про такой вызов как Task.Run, действительно можно сказать что он всегда использует пул потоков.
Настоящая разница между Task и Thread - в том, что Task имеет средства не только для того чтобы начать выполнение параллельной задачи - но и для того чтобы получить результат этого выполнения.
Pavel Mayorov
- 58,537
-
4имхо, большая разница между тредом и таском в том, что тред - это, грубо говоря, контекст выполнения инструкций, когда таск - это такая абстрактная задача. То есть это абсолютно разные понятия из разных плоскостей. – tym32167 Apr 10 '18 at 09:27
-
почему никто не затронул аспект выделения ресурсов для Thread, а Task действительно использует потоки из пула, максимальный размер которого 250 потоков по умолчанию. – Digital Core Apr 10 '18 at 09:53
-
2@DigitalCore:
Taskвовсе не обязательно использует поток из пула. Хуже того,Taskвовсе не обязательно вообще использует поток. Пример —Task.Delay. – VladD Apr 10 '18 at 10:01 -
@VladD возможно я не так выразился, имелось в виду, что если Task использует поток пула - он берёт его из пула - но не создаёт сам пул! – Digital Core Apr 10 '18 at 10:04
-
@DigitalCore https://gist.github.com/mayorovp/513b07f9e8d3507f26b30e5b1a4fda41 – Pavel Mayorov Apr 10 '18 at 10:06
-
почти везде пишут что таск это обещание, а thread выполнение. никак не могу понять. Разве когда мы вызываем таск, он разве не сразу идет выполнятся ? – Apr 10 '18 at 10:54
-
-
@ShamilQurbanli: Task = обещание — да. Thread = выполнение — ну как бы тоже да. Но аналогия ложная, выполнение не обязательно этого обещания. Просто случайно совпали слова. – VladD Apr 10 '18 at 11:32
-
Тогда я так понимаю что thread это один рабочий который выполняет все, а таск это несколько рабочие. Мы звони одному из них и даем задачу, а он обещает что выполнит это. Рабочие - это аналогия к много ядерным процессорам. Я правильно понял ? – Apr 10 '18 at 11:39
-
1@ShamilQurbanli нет, неверная. Группа рабочих - пул потоков, выраженный планировщиком задач по умолчанию. А Task - это как раз обещание данное одним из них. – Pavel Mayorov Apr 10 '18 at 11:44
-
Таск же как thread мгновенно выполняется. Почему обещание ? Не могу понять ? Почему же обещание ? – Apr 10 '18 at 12:06
-
@ShamilQurbanli Таск может мгновенно выполняться, может выполняться отложенно, может вообще не выполняться, может родиться уже выполненным, а может быть вообще не связанным с выполнением чего либо. Таск - это абстрактная операция, она не обязательно связана с выполнением какого то кода – tym32167 Apr 10 '18 at 12:28
-
@ShamilQurbanli он мгновенно начинает выполняться. А вот закончить выполняться он только обещает. – Pavel Mayorov Apr 10 '18 at 12:28
-
Каким образом обещает ? Что вообще означает обещать ? А что тогда thread делает ? Не обещая берется за работу ? Как вообще надо понять слово обещание ? – Apr 10 '18 at 13:15
-
@Shamil Qurbanli
Task = обещание — да. Thread = выполнениея вам очень советую забыть это – Vasek Apr 10 '18 at 13:30 -
1@ShamilQurbanli вы всё ещё думаете, что таск обязательно исполняет какой то код. Это не так. – tym32167 Apr 10 '18 at 13:46