6

Можно ли утверждать что Task автоматически создает пул потоков, а Thread нет ?

1 Answers1

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
  • и какое отношение имеет "обещание" к много-ядерным процессорам ? –  Apr 10 '18 at 10:55
  • @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