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

GCD Виды: 1. .main - главная очередь, тип - serial.

2. .custom - кастомная очередь, тип - serial или concurrent.
3. .global - системные очереди, тип - concurrent. Используется крайне редко в специфичных кейсах.


Типы:
1. Serial - последовательная очередь, имеет 1 поток.
2. Concurrent - параллельная очередь, имеет 1-64 потока.


Методы выполнения задач в serial и concurrent очередях:
1. .sync - синхронный - задачи выполняются друг за другом ожидая конца выполнения. Используется, когда важен порядок.
2. .async - асинхронный - задачи выполняются в параллельном потоке.

Добрый день. Сделал для себя шпору. Подскажите пожалуйста, все ли верно понял?

16 ответов

18 просмотров

Последнее неверно. Sync/async, грубо говоря, влияет на то, будет ли ставящий в очередь код дожидаться поставленной в очередь задачи. Sync — будет, async — поставит и продолжит выполнение. Для порядка выполнения есть тип очереди

Kei Sidorov
Последнее неверно. Sync/async, грубо говоря, влияе...

а про типы? serial может выполняться из разных потоков чи не? serial просто гарантирует выполнение задач по очерёдно про Concurrent на сколько я знаю цифра в 64 потока взята из предположений, эплы никогда не писали что у них ограничение на 64 потока

Ытян- Автор вопроса
Kei Sidorov
Последнее неверно. Sync/async, грубо говоря, влияе...

Неверное сформулировал, но главное что понял правильно. Я имел ввиду: Sync - работает «в паре» с другими очередями и дожидается выполнения задач по порядку Async - не дожидается. Тут скорее вопрос в том, правильно ли я понял concurrentQueue

Ытян
Неверное сформулировал, но главное что понял прави...

Я бы на собесе докапался до «по порядку». Формулировка важна

Ытян- Автор вопроса
Adel Bagautdinov
а про типы? serial может выполняться из разных пот...

Скорее да, чем нет. У Apple в документации такого не находил. Но в целом похоже на правду (тестировал циклом)

Ытян
Скорее да, чем нет. У Apple в документации такого ...

https://stackoverflow.com/questions/15150308/workaround-on-the-threads-limit-in-grand-central-dispatch

Kei Sidorov
Последнее неверно. Sync/async, грубо говоря, влияе...

Что то этот текст меня еще больше запутал. Чем отличается ‘ставящий код’ - давай называть это клоужр, чем клоужр как код отличается от ‘поставленной в очередь задачи’ - что за ‘поставлення в очередь задача'? Разве клоужр закинутый на очередь не является этой самой задачей? Тобишь sync - это когда новый клоужр должен дождаться окончания работы прошлого клоужра?

Давай ещё шпоры какие у тебя есть

Oleksandr Oliinyk
Что то этот текст меня еще больше запутал. Чем отл...

Очередь обслуживает задачи. Ок, условимся что задача = кложура. Мб так тебе проще, но я бы советовал думать абстрактно. Итак есть два вида очереди, с последовательным выполнение задач и параллельным. Какая это очередь определяется при создании очереди и изменить это поведение нельзя после. Создал serial - кложуры которые ты туда посавишь будут выполнятся одна за одной, в том порядка, в каком были добавлены в очередь. Неважно sync или async/ Задачи в очередь ствит какой-то код, который ты пишешь. Пусть у тебя будет фунция func makeThumbnail() { let source = getCurrentImage() // 1 var result: UIImage? // 2 someQueue.sync { result = source.resize() // 3 } someImageView.image = result // 4 } Вот тело это функции — код ставящий в очередь задачу. Видишь код? Что он делает? Он ставит в очередь задачу на ресайз. Конкретно в этом случае код код пойдет получит изобрадение (1), потом выделит память переменную (2) потом поставит задачу (3) в очередь и будет ждать пока она не исполнится. После чего запишет результат в имейдж вью. Что за очередь someQueue, serail или concurent неважно, важно что ставящий задачу в очередь код использует sync, то есть будет дожидаться выполнения кложуры. Примеры: - Допустим someQueue - serail очередь. В неё уже кто-то натолкал каких-то задач(кложур), пусть их будет 3. Наш makeThumbnail поставит еще одну, и будет ждать пока выполнятся 3 предидущие и интересующая его кложура. И продолжит своё выполнение только после этого. - Допустим someQueue - concurent очередь. В неё уже кто-то натолкал каких-то задач(кложур), пусть их будет 3. Наш makeThumbnail поставит еще одну. Т.к. очередь concurent предыдущие 3 будут выполнятся параллельно, наша новая задача (кложура) сразу же начнет выполнение, но мы все равно будем ждать пока она выполниться.

Небольшая ремарка, мало кто знает, но вызов sync у очереди в большинстве случаев не добавляет задачу в саму очередь, вернее сказать задача ожидает выполнение других задач в очереди, НО сама она выполняется на текущем потоке. sync ведь заставляет вызывающий поток ожидать, вот разработчики в целях оптимизации и подумали, что бы избежать переключение контекста, иногда лучше сделать вид что выполняешь задачу в очереди, на самом деле выполнить её на стороне вызывающего кода. Но спустя какое-то время, разработчики ядра улучшили свой планировщик, и с вызовом sync пошли проблемы, с одной стороны игнорируется qos очереди, так как выполняется не там, с другой переключение контекста стало не таким трудозатратным делом как раньше. Поэтому позже разработчики GCD добавили метод asyncAndWait. Он гарантирует, что задача выполнится внутри самой очереди и гарантирует что вы дождётесь на текущем потоке её выполнения. Итого вместо sync в 90% лучше использовать asyncAndWait. Не знаю кому это нужно будет, но вот как-то так 😅

найс дока кстати

Руслан Лутфуллин
Небольшая ремарка, мало кто знает, но вызов sync у...

Так это все хорошо, но где ты инфу черпаешь если не секрет? Или то надо сорсы курить и на опыте быть)))?

Adel Bagautdinov
найс дока кстати

Ну вот теперь ты знаешь в какой спешке это добавили и зачем )

Руслан Лутфуллин
Ну вот теперь ты знаешь в какой спешке это добавил...

Я скину твит главного мейнтейнера GCD на эту тему если найду.

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

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

коллеги, добрый вечер! А никто не знает как модальная форма может себя закрыть? Ну допустим модальная форма определила, что смысла ей работать нет и хочет вернуть modalResult...
Михаил
82
Hi there everyone Is there anyone who have not started hamster bot yet? I need only one, I'll be glad if you do this for me DM if you haven't yet
Mehrshad
53
Что нового в Xcode 16 Xcode 16 приносит много обновлений. Главное - появление ИИ, которое отметили еще в кейноуте. В Xcode появится предиктивное завершение кода, основанное н...
✌️(´ヮ`)
1
А как старый хаскел с новым стыковать ? потому как тут работает https://play.haskell.org/saved/C3xpMzcd, а вот тут https://stepik.org/lesson/7602/step/9?unit=1473 нет ошибка C...
Fedor
131
Знатоки правильных подходов )) А зачем тогда ShowModal виртуальный?)) Потому что те кто писал vcl - извращенцы?)
Михаил
7
hi my MyAsus app has informed me of a new version of bios (version 300), i tried installing it but after this attempt it said: Update failed. Does anyone have any solution? My...
Sahand 🏔️
13
всем привет! у кого есть опыт подписания и нотаризации electron приложений для macos? такая проблема: использовал @electron/osx-sign и notaritool. процесс подписания и нотараз...
Артем Клементьев
11
why some site like google has separate page for username/email and password?
Mr Thieves
21
@Dreamer_0x01 @helgispbru @Ambrion Разговор шёл об уязвимости. Меня беспокоит именно она. Все прочие вопросы, а равно и жизненная мудрость - пока в сторону :) Так вот сам ...
Андрей [aharito] Харитонов
9
Мне интересно, скорее людей здесь используют D, Rust, C/C++ для решения реальных прикладных задач за деньги?)
Evil Satanson
49
Карта сайта