Как текущая очередь, очередь отправки и целевая очередь взаимодействуют друг с другом в GCD? - PullRequest
0 голосов
/ 20 января 2020

Я следил за блогами, онлайн-статьями, видео для GCD, и я столкнулся с целевой очередью терминов (в некоторых блогах). Я думал, что понял GCD, но тогда эта терминология целевой очереди действительно смутила меня.

Что я понял:

Например:

viewdidload(){
       DispatchQueue.main.async{
          print("hello world")
       }
}
  • текущая очередь : главная очередь, так как viewdidload вызывается из основного потока.
  • очередь отправки: главная очередь, потому что "DispatchQueue.main"
  • целевая очередь: ну, я не уверен в этом, это может быть параллельная очередь , но как тогда текущая очередь, очередь отправки и целевая очередь взаимодействуют друг с другом в GCD?

1 Ответ

2 голосов
/ 21 января 2020

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

Когда вы создаете пользовательскую очередь, вы можете определить ее как цель, очередь, которую ваша пользовательская очередь будет использовать за кулисами. Таким образом, если вы создадите очередь A с целевой очередью T, то все, что отправлено на A, будет фактически выполняться на T. Таким образом, вы можете спросить, когда кто-то склонен использовать этот шаблон:

  1. Возможно, у вас есть несколько очередей, которые вы хотите поделиться некоторым поведением. Например, у вас могут быть очереди A, B и C, которые все используют последовательную очередь T в качестве своей цели. Тогда не только A, B и C будут последовательными, индивидуально, но и по A, B и C. Например, отправка чего-либо в A и другого в очередь B, задача на B будет ожидать выполнения задачи на A до конца sh (из-за последовательной природы T, их общей цели Очередь).

    Или представьте, что у вас есть три одновременных очереди, A, B и C, но иногда вы хотите создать барьер для всех трех, некоторые критические задачи, которые не могут выполняться одновременно в отношении всего, что работает в этих трех очередях. Если при создании A, B и C вы указали параллельную очередь T в качестве целевой очереди для всех из них, если вы добавите барьерную задачу в T, тогда A , B и C будут соблюдать этот барьер.

  2. Вы можете использовать целевые очереди, если вы профилируете свой код и обнаружите, что у вас очень много «контекста» переключается », где ваш код GCD приводит к постоянному переходу между разными потоками. Для обычных приложений GCD (например, запустить этот вычислительно дорогой код в некоторой фоновой очереди, а затем отправить обновление обратно в основную очередь), эта концепция целевой очереди не дает практического преимущества. Но если вы делаете тысячи / миллионы отправлений между очередями GCD, это может быть актуально. Но профилируйте свой код, прежде чем беспокоиться, чтобы определить, сколько переключений контекста происходит, и посмотреть, принесет ли это какую-либо практическую пользу в вашем сценарии.

    Примеры того, где вы можете использовать целевые очереди для этих проблем, связанных с производительностью, см. WWD C 2017, видео Модернизация Grand Central Диспетчеризация Использование: введение единой идентификации очереди . В приведенной выше ссылке я пытался высветить вас в соответствующей части видео, но просмотр всего видео мог бы предложить более широкий контекст.

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

...