реклама
разместить

Actor'ы в Swift

Начиная с версии Swift 5.5 появился новый ссылочный тип (reference type) - акторы. В данной статье будет рассказано, для чего их добавили и какую роль они выполняют.

Для того чтобы узнать, в каких случаях используются акторы, давайте рассмотрим типичный пример data race с использованием non-thread safe коллекции.

Actor'ы в Swift

Здесь представлен класс Library которые выступает в качестве "контейнера" для объектов класса Book. Данный код работает корректно в однопоточной среде. Для многопоточного приложения данная реализация будет аварийно завершать программу.
Существует множество способов для устранения этой проблемы. Одним из них - это создание приватной concurrent очереди и методы add(_ book:) и get(name:) обернуть в синхронный вызов данной очереди. Очевидным минусом данного подхода является производительность. Во время выполнения одного из методов, второй будет дожидаться окончания его завершения.
Второй способ устранения данной патологии - это реализация SWMR подхода, однако реализация чуть усложняется с использованием dispatch_barrier.

Для устранения всех рассмотренных недостатков как раз и вступают в игру акторы. Акторы, как уже упоминалось ранее, являются ссылочным типом, а так же они синхронизируют все вызовы к методам и свойствам. Это означает что только один вызывающий объект имеет атомарный доступ к операциям которые предоставляет актор. Нам достаточно лишь поменять тип у Library для получения этих преимуществ.

Actor'ы в Swift

Одного лишь этого изменения достаточно чтобы сделать данный контейнер потокобезопасным. Теперь можно использовать данный класс в многопоточной среде не опасаясь data race.

Так же, стоит учесть, что взаимодействовать с акторами мы можем только в асинхронном режиме, а именно вызывать методы add(_ book:) или get(name:) мы должны в методе с async семантикой:

Actor'ы в Swift

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

1010
реклама
разместить
7 комментариев

Отличный пример асинхронного кода! Спасибо

1

Комментарий недоступен

В стандартной акторной модели, как правило содержится очередь операций. Так вот в данном случае данная очередь избавляет нас от тех проблем, которые были затронуты в статье, а именно операция на входе ждёт пока завершится текущая операция в акторе.
Так же, ключевое слово await тоже можно рассматривать как отправку сообщений в стандартной акторной модели.

С точки зрения алгоритмов и структур данных, блокировка get() и add() в этом примере несимметрична. Предполагая, что book - стандартная хеш-таблица, вызовы add() блокируют друг друга и get(). А вот get() друг друга не блокируют, потокобезопасно читать можно сколько угодно. Интересно, учитывает ли этот факт реализация Actor, и учитывает ли программист на Swift, если ему достаточно только применить Actor.

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

«Допустимое далеко стоит от нормальности»: в НИУ ВШЭ описали потребительские стандарты глазами россиян — это «комфорт», «норма», «жить можно» и «очень тяжело»

Первый предполагает «элитарность». Последний — существование на грани выживания.

Источник фото: «Лента.ру»
1515
11
реклама
разместить
Джеки Чан на «Черкизоне» и кассирша Скарлетт Йоханссон: в соцсетях генерируют ролики со звёздами в российской провинции

Всё дело в нейросети Reve, которая в марте научилась воссоздавать российские реалии.

2424
1313
55
22
11
Пару лет назад ещё было смешно посмотреть на звёзд голливуда в антураже российской глубинки 90-х, но сейчас уже как-то кринж, если честно.
Как я запускал онлайн-марафон по похудению 10 лет назад и попал на билборды в нескольких городах бесплатно. И причём тут Ждун?

Я запустил марафон по похудению с нулевым бюджетом и даже что-то заработал.

Как я запускал онлайн-марафон по похудению 10 лет назад и попал на билборды в нескольких городах бесплатно. И причём тут Ждун?
11
11
Найм после 40 лет. Есть ли шанс найти работу?

Недавно понял, что инстинктивно пропускаю анкеты тех, кому 40+. Хотя сам давно старик. Со слов HR проблема частая.
Можно обсуждать причины, но факт есть факт. Что делать?

Найм после 40 лет. Есть ли шанс найти работу?
4646
2222
66
44
22
Да можешь дальше игнорить анкеты 40+ С текущей ситуацией на рынке труда просто не найдешь себе сотрудника. Прошли те времена, когда зажратый наниматель брал только от 20 до 25, с "горящими глазами", потому что "очередь за забором"
Mash сообщил о «скрытном» сокращении производства у «АвтоВАЗа» на фоне «затоваривания» — компания это отвергла

В феврале 2025 года производитель говорил, что его запасы приблизились к 100 тысячам машин при норме в 60 тысяч.

Источник: «АвтоВАЗ»
1515
1313
Четвертый год шло всё по плану
«Дух форумов раннего интернета, на которые зашёл неясно зачем и где никого не знаешь в реальной жизни»: это соцсеть seven39

Она работает три часа в сутки, не содержит рекламы и не заставляет «бесконечно думскроллить».

Скриншот vc.ru
66
33
22
Американский форум. Задаёшь вопрос, потом тебе отвечают. Израильский форум. Задаёшь вопрос, потом тебе задают вопрос. Русский форум. Задаёшь вопрос, потом тебе долго рассказывают, какой ты мудак.
Microsoft анонсировала обновление Copilot: чат-бот сможет бронировать столики, создавать подкасты, проводить исследования и другое

Компания планирует добавлять функции постепенно, но конкретными сроками не делится.

44
33
11
11
80 нейросетей, которые помогут тебе разобраться в теме и проанализируют десятки источников. Залил в одну табличку + краткое описание — эпичная подборка
80 нейросетей, которые помогут тебе разобраться в теме и проанализируют десятки источников. Залил в одну табличку + краткое описание — эпичная подборка
142142
66
44
44
Мне нужна нейросеть чтобы разобраться в подборке из 80 нейросетей