172 похожих чатов

@Jeudesprits а вы не могли бы объяснить, почему у нас

в swift concurrency есть механизм отмены, который хорошо бы использовать, но при этом чтобы отменить callback based операцию с withCheckedContinuation нужно сделать кучу приседаний?

5 ответов

19 просмотров
Igor- Автор вопроса
Руслан Лутфуллин
Оно?

Если речь про withTaskCancellationHandler, то я вот на такой тред наткнулся и там прям какие-то костыли делают с оберткой для того, чтобы корректно вызвать отмену у объекта выполняемого

Правильно ли я тебя понимаю, что withTaskCancellationHandler в данный момент заставляет использовать некий механизм синхронизации разделяемого состояние, мало того, что это просто лень делать потому что это громоздко, так ещё это сложно сделать правильно? Но по твоей же ссылке кажется и даны ответы. Ну предположим, способ которым можно было бы упростить это дело, сделать этот хендлер асинхронным и его вызов получается синхронным относительно таска у которого вызывается отмена. Окей. Это бы решило проблемы разделяемого состояние, но когда его вызывать внутри таска? Единственная ближайшая такая точка в момент отмены таска, это ближайший suspension point, но переход в этот suspension point будет после того, как потенциальная большая задача в таске завершится или вызовется yield. Это ведь полностью противоречит ожиданиям. Произошла отмена, любой таск в группе это видит и моментально может выполнить задачу, либо выбросит исключение, где его так же моментально можно будет обработать. Но в нашем случае, хендлер не может выполниться моментально, ибо очевидно, что вызов такого хендлера внутри таcка после отмены будет искать suspension point что бы таки вызвать наш хендлер отмены. Здесь правильно было бы сделать более простой механизм защиты разделяемого состояние в таких случаях и сделать его в рамках swift concurrency. А сейчас мы этого не можем сделать. У нас есть актор, но у нас нет механизма отправки сообщений в актор в синхронном контексте. (Это вроде как ожидается, но придётся ждать Swift 6) У нас также в таком случае не гарантируется очередность вызовов в акторе, то есть нет гарантии нужной очередности вызова нашего хендлера. Если бы этого всего можно было избежать, то это бы позволило легче это делать или сделать некий более простой механизм поверх. А пока у нас есть только более-менее простой способ с ManagedBuffer и локом внутри, лучше с os_unfair_lock, либо более быстрый механизм с атомиками. Но всё это выходит за рамки swift concurrency 😐

Похожие вопросы

Обсуждают сегодня

Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
И никого не интересует какие пакеты кто использует. ((% Заходишь на сайт симфони и видишь поддержку Украины - по законам РФ это ж экстремизм. Только никто не отказывается от с...
Am Ambrion
11
Мне вот любопытно. Уже сколько времени имею соблазн купить макбук, ибо подозреваю что очень уж удобен будет в связке с другой техникой от эпл которая у меня есть, да и сам по ...
Not Yeromin
9
лучше скажите, причём тут паскаль?
Alexey Kulakov
36
Чтобы перехватить все нажимания буков на форме, надо хук ставить? Пробовал на форме ОнКейДаун, оно ловит клаву если фокус не на компоненте с вводом текста
Serjone
15
Но, может, есть уже проверенная? Наши требования такие: 1. Сообщения должны приходить из Инста в CRM оду 2. Должна быть возможность подключить несколько экаунтов Инстаграм. Р...
Alexander Sharoiko MSE / Александр Шаройко
7
Народ! Впервые клиенту пришло письмо от РКН, у вас, дескать, есть яндекс метрика, а нигде не написано, что вы ее юзаете. Никто не сталкивался?
Sasha Beep
14
Всем привет! вывожу на общей стр дочерние ресурсыв каждом ресурсе галерея, и первая фотка должна выводиться на общей [!DocLister? &prepare=photo !]
Alekso
12
Я правильно понимаю что нет способов получить список ожидающих заявок на вступление в группу с помощью бота из mtproto?
Шамиль Прилов
7
А можно вопрос? Мне сегодня сказали что у меня функция (которая просто заполняет массив значениями) не правильная void Full(double * arr, int n) { for (int i = 0; i < n; i...
† C E †
7
Карта сайта