Pull to refresh

Comments 16

Я не владыка корутин в Котлине, мне просто интересно почему минусуют эту статью?
Я не знаю Kotlin вообще. Но далее следует общее опредление, свойственное всем известным мне реализациям.

Видимо потому что автор вообще не знает разницу между асинхронным и многопоточным кодом.

Видимо потому что корутины не являются потоками, от слова вообще. Корутины — синтаксический сахар. Корутины не являются многозадачными, вообще и никак. Корутины исполняются строго в вызываемом потоке, просто асинхронно и не более. Они не могут вызываться в других потоках, чтобы избежать проблем с хранимыми данными на стеке, которые захватываются контекстом корутин.

Как оно выглядит для компилятора: код корутин разворачивается во время компиляции на несколько отдельных блоков кода. Которые будут вызваны по мере выполнения асинхронных задач. При этом сохраняется последовательность кода. Просто за программиста убирается ад колбэков.
Можно уточнить, а в каком потоке выполняются сами асинхронные задачи? Над ней работает другой поток, который и занимается задачей, затем дергается callback в исходный? Или как это вообще работает?
Вот, к примеру, тот же JS и сетевой запрос с коллбеком. При отправке запроса UI не тормозит, потому что единственный поток свободен и готов его обновлять. Но где крутится сам запрос?
Конкретно работа с сетью, с файлами находится в недрах реализации мультиплексирования неблокируемого ввода-вывода, этим по сути заведует ОС. Подробнее можно поглядеть для win — IOCP, для Linux — epoll, для BSD — kqueue, либо библиотеки более высокого уровня — libuv, libev, libevent, boost::asio.

Где-то за кулисами может и быть и ожидание в отдельном потоке (на зачастую это не самое хорошее решение), либо одним потоком можно опрашивать состояние большого кол-ва задач (получше, но всё же всё равно плохо).
Спасибо. Другими словами, все-таки можно сказать, что хоть и в рамках языка программирования мы и говорим, что все в одном потоке, но при использовании async/await «за кулисами» в любом случае идет какая-то фоновая работа (причем нам даже не всегда известно, как именно это реализовано).
Раньше очень смущала такая формулировка, т.к. в любом случае очевидно, что для того, чтобы любую операцию выполнить асинхронно, мы все равно должны эту асинхронную работу где-то выполнить.
UFO just landed and posted this here
Ну перевод-переводом, но я думаю, что надо всё же читать, что переводишь. И соответственно не переводить такого рода бред.

Сразу видно, что вы не знаете Котлин вообще и его корутины — в частности. Корутины(более того, куски корутин между suspension-point'ами) могут выполняться на рандомных потоках в рамках пула.

Что статья что перевод — статья ради статьи. Неинформативна совсем.
> И Корутины, и потоки являются многозадачными.
LOL
Kotlin реализует Корутины без стека — это значит, что в Корутинах нет собственного стека, поэтому они не привязываются к нативному потоку.

Не совсем понимаю, что тут имеется ввиду. Если у корутин нет своего стека, разве это не значит, что они используют стек потока, в котором выполняются, а значит, они привязаны таки к потоку?

Используют, но в момент suspend'инга корутина сохраняет весь свой стек в объект и разворачивает его обратно в момент resume. Поэтому корутинам и не важно, в каком потоке они выполняются — всё их состояние хранится в обычном объекте.
Ха, Альфа-Банк тоже не знает разницу между асинхронностью и многопоточностью. По крайней мере по началу статьи.

Вполне годная статья для первоначального знакомства с корутинами. Спасибо.

Sign up to leave a comment.

Articles