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

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

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

5 ответов

8 просмотров

Оно?

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

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

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

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

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

что насчет пагинга? на осдеве непонятно(
Vi Chapmann 🪙
26
А как старый хаскел с новым стыковать ? потому как тут работает https://play.haskell.org/saved/C3xpMzcd, а вот тут https://stepik.org/lesson/7602/step/9?unit=1473 нет ошибка C...
Fedor
131
Вопрос я правильно понимаю что в коде newtype ArrowMap k v = ArrowMap { getArrowMap :: k -> Maybe v } getArrowMap есть функция типа k -> Maybe v, если да, то не понимаю задач...
Fedor
64
Ребят, что лучше для реверса: гидра или ида?
En Vind Av Sorg
26
Делаю велосипед логгер. К сообщению хочу прикрутить некоторую информацию, типа, кем отправлено, какой уровень, и всякое такое. И тут подумалось мне, почему бы не хранить весь...
Serjone
24
Как Вы считаете нормально ли в двадцатых годах 21 века в ВУЗах Российской Федерации обучать студентов работе с TASM? Не слишком ли это "архаично"? (Если оффтоп или флейм для э...
Spiker01
52
если загрузчик efi? если сама PML4 PDPT PDT PT лежит в неудобном для меня месте?
Vi Chapmann 🪙
8
Комрады, хотел уточнить. Проперть в OnDestroy юнита-хозяина по-прежнему доступна? И еще уточнение: finalization юнита наступает раньше или позже OnDestroy?
Ed Doc
48
А я же правильно понимаю, что инструкция AT в ld только сохраняет метаинформации о том, куда загрузить сегмент, которую далее из эльфика читает grub(ну если граб)? Но я тогда ...
Evg Resh
2
Господа, импользую кастомный загрузчик, ядро запускается сразу в длинном режиме, хочу узнать, сколько всего физической ОЗУ есть у машины. И, может, знаете какие-то подводные к...
Vi Chapmann 🪙
6
Карта сайта