Блокирует ли kotlin сопрограммы поток ввода-вывода, пока он не завершится? - PullRequest
0 голосов
/ 04 октября 2018

Из того, что я понимаю, сопрограмма, которая блокирует IO, заблокирует поток, в котором она работает.Поток будет приостановлен ОС, чтобы быть перенесен на более поздний момент.

Означает ли это, что если у меня есть пул потоков с 50 потоками и 50 параллельными сопрограммами, выполняющими ввод-вывод в каждом из потоков, они будут эффективно блокировать все потоки в пуле потоков, пока хотя бы один из них не завершит ввод-вывод-операция?

Или есть механизм для парковки сопрограмм, который вызвал блокировку ввода-вывода в какой-то очереди?

1 Ответ

0 голосов
/ 05 октября 2018

если у меня есть пул потоков с 50 параллельными сопрограммами, выполняющими IO на каждом из потоков, они будут эффективно блокировать все потоки в пуле потоков, пока хотя бы один из них не завершит IO-операцию?

Да.Нельзя обойти тот факт, что блокирующий метод блокирует вызывающий поток.Сопрограммы - это не волшебная палочка, которая меняет это.

Значение сопрограммы заключается в том, что вы можете перенести операцию блокировки из потока пользовательского интерфейса в пул потоков, используя очень естественную модель программирования.Код выглядит как обычный вызов функции, который завершается возвращаемым значением, но на самом деле сопрограмма приостанавливается, так что другие обработчики событий пользовательского интерфейса могут работать.

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

...