Подтвердить что ты не робот

В чем разница между dispatch_get_global_queue и dispatch_queue_create?

Я пишу умеренно сложную программу iOS, которая должна иметь несколько потоков для некоторых своих более длительных операций (синтаксический анализ, подключения к сети... и т.д.). Однако я смущен относительно того, какая разница между dispatch_get_global_queue и dispatch_queue_create.

Какую пользу я должен использовать, и не могли бы вы дать мне простое объяснение того, какая разница вообще? Спасибо.

4b9b3361

Ответ 1

Как описывает documentation, глобальная очередь хороша для одновременных задач (т.е. вы собираетесь асинхронно отправлять различные задачи, и вы "если они будут работать одновременно), и если вы не хотите столкнуться с теоретическими накладными расходами на создание и уничтожение собственной очереди.

Создание собственной очереди очень полезно, если вам нужна последовательная очередь (т.е. вам нужно, чтобы рассылаемые блоки выполнялись по одному за раз). Это может быть полезно во многих сценариях, например, когда каждая задача зависит от предыдущей или координирует взаимодействие с каким-то общим ресурсом из нескольких потоков.

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

Мой общий совет, если вам нужна очередная очередь (или нужно использовать барьеры), затем создайте очередь. Если вы этого не сделаете, продолжайте использовать глобальную очередь и обходите накладные расходы на создание собственных.


Если вам нужна параллельная очередь, но вы хотите контролировать, сколько операций может выполняться одновременно, вы также можете рассмотреть возможность использования NSOperationQueue, которая имеет a maxConcurrentOperationCount. Это может быть полезно при выполнении сетевых операций, и вы не хотите, чтобы на ваш сервер отправлялось слишком много одновременных запросов.

Ответ 2

Просто опубликовано в другом ответе, но вот что-то, что я написал довольно давно:

Лучший способ концептуализации очередей - сначала понять, что на очень низком уровне существует только два типа очередей: последовательный и параллельный.

Последовательные очереди являются моногамными, но не допускаются. Если вы даете кучу задач для каждой очереди, она будет запускать их по одному, используя только один поток за раз. Несоблюденный аспект заключается в том, что последовательные очереди могут переключиться на другой поток между задачами. Серийные очереди всегда ждут завершения задачи, прежде чем перейти к следующей. Таким образом, задачи выполняются в порядке FIFO. Вы можете сделать столько последовательных очередей, сколько вам нужно с помощью dispatch_queue_create.

главная очередь - это специальная последовательная очередь. В отличие от других последовательных очередей, которые не зарегистрированы, поскольку они "датируют" многие потоки, но только по одному, основная очередь "вышла замуж" за основной поток, и все задачи выполняются на нем. Работы в главной очереди должны вести себя хорошо с runloop, чтобы небольшие операции не блокировали пользовательский интерфейс и другие важные биты. Как и все последовательные очереди, задачи выполняются в порядке FIFO.

Если последовательные очереди моногамны, то параллельные очереди являются беспорядочными. Они будут отправлять задания на любой доступный поток или даже создавать новые потоки в зависимости от загрузки системы. Они могут выполнять несколько задач одновременно на разных потоках. Важно, чтобы задачи, представленные в глобальную очередь, были потокобезопасными и минимизировали побочные эффекты. Задачи отправляются на исполнение в порядке FIFO, но порядок их выполнения не гарантируется. На момент написания этой статьи есть только три параллельные очереди, и вы не можете их сделать, вы можете получить их только с помощью dispatch_get_global_queue.

edit: сообщение в блоге, расширяющееся на этот ответ: http://amattn.com/p/grand_central_dispatch_gcd_summary_syntax_best_practices.html

Ответ 3

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