Паралелізм в середовищі Cocoa, Mac OS, iOS
Відправка черг (Dispatch Queues).
Grand Central Dispatch (GCD) відправка черг є потужним інструментом для виконання завдань. Відправка черзі дозволяє виконати проізвольниt блокb коду, як асинхронно так і синхронно по відношенню до викликав потоку. Ви можете використовувати відправку черзі, щоб виконати практично всі завдання, які використовуються для виконання в окремих потоках. Перевага відправки черг в тому, що вони простіше у використанні і набагато більш ефективні при виконанні цих завдань, ніж відповідний багато-код.
Відправка черзі є об'єктно-подібною структурою, яка керує завданнями, які представляють її. Усі надіслані черги шикуються в структуру даних за принципом: першим увійшов, першим вийшов. Таким чином, завдання, добаленние в чергу завжди починаються в тому ж порядку, в якому вони були додані. GCD забезпечує деякі відправки черзі за вас автоматично, а інші ви можете створити для конкретних цілей. У таблиці 3-1 перераховані типи відправки черзі доступні для вашої програми, і опис як ви їх далі використовуєте.
Таблиця 3-1 Типи відправки черзі
Послідовна чергу (також відома як private dispatch queues) виконує одну задачу за раз в тому порядку, в якому вони будуть додані в чергу. Поточне виконання завдань працює на різних потоках (які можуть змінюватися від завдання до завдання), які управляються відправкою черзі. Послідовні черзі часто використовуються для синхронізації доступу до конкретного ресурсу.
Ви можете створити стільки послідовних черг, скільки вам потрібно, і кожна чергу працює одночасно по відношенню до всіх інших черг. Іншими словами, якщо ви створите чотири послідовні черзі, кожна чергу виконує тільки одну задачу за раз але до чотирьох завдань, все ще може виконуватися одночасно, по одному від кожної черги. Для отримання інформації про те, як створити серійну чергу, див. Розділ «Створення Послідовною черзі відправки."
Паралельна чергу (також відомий як тип глобальної черги відправки (global dispatch queue)) виконує одну або кілька завдань одночасно, але завдання все ще начанаются в порядку, в якому вони були додані в чергу. Поточне виконання завдань, працює на різних потоках, які перебувають у віданні відправки черзі. Точне число завдань, що виконуються в даний момент є змінним і залежить від умов системи.
Ви не можете самі створювати паралельні черги відправки. Замість цього, існує три глобальних черзі для одночасного використання в вашому додатку. Для отримання додаткової інформації про те, як отримати глобальну одночасну чергу см. В розділі "Отримання глобальної паралельної черзі відправки."
Main dispatch queue
Основна чергу відправки є глобально доступною послідовної чергою, яка виконує завдання з основних потоці додатки. Ця чергу працює з основним циклом додатка (якщо такий є), щоб чергувати виконання завдань в черзі з виконанням інших джерел подій, прикріплених до основного циклу програми. Оскільки вона працює на основному потоці додатки, основна чергу часто використовується в якості ключової точки синхронізації для програми.
Хоча ви не повинні створювати основну чергу відправки, вам потрібно переконатися, що ваш додаток протікає відповідним чином. Для отримання додаткової інформації про те, як ця черга управляється см. В розділі "Виконання завдань в головному потоці".
Коли справа доходить до додавання паралелізму в додаток, відправка черг забезпечує ряд переваг перед потоками. Найбільш прямим перевагою є простота роботи моделі програмування черзі. З потоками, ви повинні написати код, як для завдання, яке необхідно виконати, так і для створення і управління потоками самі. Відправка черзі дозволить вам зосередитися на завданні, яку ви дійсно хочете виконати, не турбуючись про створення потоків і управління ними. Замість цього, система обробляє всі створення і управління потоками за Вас. Перевага полягає в тому, що система може управляти потоками набагато ефективніше, ніж будь-який окремо взятий додаток коли-небудь могло-б. Система може масштабувати кількість потоків динамічно на основі наявних ресурсів і поточного стану системи. Крім того, система, як правило, має більш швидку можливість для запуску вашого завдання, ніж ви, якщо ви створили потік самі.
Хоча ви можете подумати, що переписувати код для відправки черзі буде важко, часто легше написати код для відправки черзі, ніж писати код для потоку. Ключ - написання коду для розробки завдань, які є автономними і здатні працювати в асинхронному режимі. (Насправді це вірно і для потоків і для відправки черг). Однак перевага відправки черзі полягає в передбачуваності. Якщо у вас є два завдання, які звертаються до одного спільного ресурсу, але працюють на різних потоках, або потік може змінити ресурс першого і вам потрібно буде використовувати блокування, щоб обидва завдання не змінювали цей ресурс в один і той же час. При відправці черзі, можна додати завдання до послідовної черги надсилання, якщо потрібно тільки одне завдання змінювала ресурс в будь-який момент часу. Цей тип черг на основі синхронізації є більш ефективним, ніж блокування, тому що блокування завжди вимагають дорогу пастку ядра і оскаржуються в незаперечних випадках, в той час як відправка черзі працює в основному в просторі процесу додатки і тільки викликає його на рівні ядра, коли це абсолютно необхідно.
Хоча буде правильним сказати, що два завдання, які працюють в послідовній черзі, не можуть працювати одночасно, ви повинні пам'ятати, що якщо два потоки беруть блокування в один і той же час, будь-який паралелізм, пропонований потоками втрачається або значно скорочується. Більш того, з потокової моделлю потрібне створення двох потоків, які займають обидва ядра і в просторі користувача пам'яті. Диспетчер черг не платить таку ціну за виділення пам'яті для своїх потоків і потоки, які вони використовують зберігаються зайнятими і не блокуються.
Технології зв'язування черг
На додаток до відправки черзі, Grand Central Dispatch пропонує кілька технологій, які використовують черзі, щоб допомогти керувати кодом. У таблиці 3-2 перераховані ці технології, а також посилання, де ви можете дізнатися більше інформації про них.
Таблиця 3-2 технології, які використовують відправки черзі