Как стать автором
Обновить

Комментарии 5

Как введение статья хорошая, однако разбор понятий concurrency и parallelism здесь приделан как-то сбоку и вообще непонятно, зачем нужен.

То же самое про корутины. В официальной документации и литературе по теме (Modern Swift Concurrency от Ray Wenderlich, например) этот термин не используется.

В голове от этого может сложиться ложное впечатление о связи свифтовского async/await с корутинами в Go и Kotlin, когда как на деле кроме синтаксиса в них мало что похоже.

Разбор определений нужен был для более подробного описания модели и для использования этих терминов в будущих статьях.

В первом абзаце есть ссылка на proposal, в котором упоминается о использовании данной модели в Swift 5.5 Если обратиться к википедии, то мы увидим следующую терминологию:

"Coroutines are computer program components that generalize subroutines for non-preemptive multitasking, by allowing execution to be suspended and resumed."

Swift с новой поточкой подходит под все характеристики, а именно: У нас non-preemptive multitasking, мы можем приостанавливать задачи и продолжать их выполнение.

Возможно, мы ошибаемся, тогда хотелось бы услышать, в чём фундаментально заключается отличие async/await от Kotlin.

Никита Сосюк, автор статьи

В официальной документации, сессиях WWDC и книге SPL термин "корутина" не встречается. Думаю, неспроста. Не сбивайте людей, потому что корутины в Свифте официально так не называются.

Википедию может редактировать кто угодно, это не аргумент. Многозадачность у них все-таки вытесняющая - в любой момент выполняющийся на ядре код может быть приостановлен операционной системой. Не забывайте, что Darwin не DOS. Вытеснения нет только от других таких же "partial tasks", и кооперация у них только между собой, а не на уровне потоков ОС.

Фундаментального отличия от Kotlin нет, но есть мелкие, которые очень важны - компиляция (аналога Sendable, насколько я понял, нет, то есть компилятор полезть в shared state запретить не сможет, особенно если через java/инструментацию), в Свифте нельзя управлять Executor'ами, в отличие от котлина (попробуйте, например, заставить таски выполняться на нужных потоках в нужном порядке - в Свифте это сейчас невозможно), ну и вместо каналов используется совсем иная идея с акторами.

Может, в чем-то неточен, на котлине ежедневно не пишу, но в целом различия для меня достаточно разительные и влияют на ежедневную мобильную разработку непосредственно - точно управлять потоками в тестах, например, необходимо очень часто. Вы пишете "мы можем приостанавливать задачи и продолжать их исполнение", но на деле в Свифте "мы" мало что можем, все partials отдаются компилятору как есть и влияние на них программиста ограничивается cancel'ом и yield'ом. В котлине поближе к народу все-таки.

Мы рады прислушиваться к Вашим комментариям, чтобы дополнять или исправлять статью. Мы исправили название статьи, убрав слово «Swift», чтобы не вводить Вас в заблуждение. 

Однако есть пару моментов: 

1. Согласно propasal новая поточка базируется (берет основы) этой модели. В рамках данной статьи мы рассказали именно о принципах работы модели корутин. Четкой аналогии с языком Swift я не проводил и не называл асинхронные функциями в Swift корутинами. 

2. Давайте все-таки не спускаться до устройства операционной системы, чтобы оставить низкий порог входа у статьи. Мною сделан вывод о том, что новая поточка реализует cooperative multitasking, исходя из того, что мы сами указываем, в какой момент выполнения может остановиться наша функция. Безусловно, система сама управляет потоками, решать таким моменты у разработчика нет возможности. Однако раньше мы могли лишь гадать, а сейчас указываем эти места благодаря новому синтаксису 😃

3. Сама модель общая (остановка и продолжение выполнения задач, стек вызовов и т.д.) Различия, безусловно, есть. Решения разных языков не идентичны и на это есть свои причины. Специфику Swift мы разберем в следующих статьях (Sendable и т.п).


Сама статья как раз подводит к тому, как реализована работа с async/await в Swift, а именно к реализации Task и всему соответствующему. 

Предлагаю дождаться следующей статьи и обсудить там. 

Спасибо за комментарий!

Благодарю за ответ! Жду следующих статей. В интернете сейчас мало информации по теме, за пределами простейших примеров мало кто ходит, а в продакшене и того меньше можно встретить.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации