если у меня есть пул потоков с 50 параллельными сопрограммами, выполняющими IO на каждом из потоков, они будут эффективно блокировать все потоки в пуле потоков, пока хотя бы один из них не завершит IO-операцию?
Да.Нельзя обойти тот факт, что блокирующий метод блокирует вызывающий поток.Сопрограммы - это не волшебная палочка, которая меняет это.
Значение сопрограммы заключается в том, что вы можете перенести операцию блокировки из потока пользовательского интерфейса в пул потоков, используя очень естественную модель программирования.Код выглядит как обычный вызов функции, который завершается возвращаемым значением, но на самом деле сопрограмма приостанавливается, так что другие обработчики событий пользовательского интерфейса могут работать.
Однако сопрограммы действительно светятся при работе с неблокирующей асинхронной функцией.API на основе обратных вызовов.В этом случае вы можете получить поведение, которое можно описать как «однопоточный параллелизм» в потоке пользовательского интерфейса.Параллелизм работает путем чередования выполнения обработчиков событий.Основное отличие от собственных потоков состоит в том, что чередование не зависит от упреждающего приостановления потоков без их ведома.Вместо этого сопрограмма должна сама попросить, чтобы ее отстранили.