Итак, выполнение этого внутри сопрограммы НЕ дает мне преимущество приостановки его выполнения?
Я не уверен, что понимаю, что вы имеете в виду, но вызывая функцию приостановкив любом случае приостановит вызов сопрограммы, какой бы диспетчер вы ни выбрали, и это не зависит от того, что находится внутри функции, насколько я знаю.
Однако, обратите внимание, что вызов функции , блокирующей изнутри сопрограмма сделает этот блок сопряженным с потоком, выполняющим его, здесь нет никакой магии.Вот почему следует избегать операций блокировки внутри сопрограмм.
Единственное (ценное) преимущество, которое сопрограммы дают мне, когда речь идет о функциях, связанных с процессором, - это возможность выбрать поток (или пул потоков), которыйбудет заблокирован во время выполнения функции, я прав?
Использование Dispachers.IO
или Dispatchers.Default
имеет эффект только выбора другого пула потоков, да.
В случае IO
пул будет порождать столько потоков, сколько необходимо, поскольку все они могут быть «заблокированы при вводе / выводе».
В случае Default
толькокогда-либо будет создано количество потоков, пропорциональное количеству ядер, потому что для задач с привязкой к ЦП не будет смысла создавать больше потоков, чем ядер (если все ядра заняты, переключение контекста может только ухудшить общую производительность).