GCD: у потока есть только два типа?основной поток и фоновый поток - PullRequest
0 голосов
/ 29 мая 2018

Контекст:

Насколько я понимаю, Main DispatchQueue отправляет только задачи на Main Thread, который в основном предназначен для пользовательского интерфейса.

Однако Main Thread также может использоваться неосновными DispatchQueue s.

У Apple есть QOS для приоритетов задач:

Интерактивный пользовательский : работа, выполняемая в главном потоке, например анимация или операции рисования.

Инициировано пользователем : Работа, которую пользователь запускает и должна дать немедленные результаты.Эта работа должна быть завершена, чтобы пользователь мог продолжить.

Утилита : Работа, которая может занять немного времени и не требует немедленного завершения.Аналогично индикаторам выполнения и импорту данных.

Фон : Эта работа не видна пользователю.Резервное копирование, синхронизация, индексирование и т. Д.

Мой вопрос:

0, как описано в заголовке, содержит ли поток только 2 типа, которые Main Thread и Background Thread?

1, означает ли Background Thread, что все выполненные задачи не будут блокировать пользовательский интерфейс?

2, поскольку в нем упоминается, что User Interactive является приоритетомчто задача будет выполняться в главном потоке, чтобы избежать задержек пользовательского интерфейса, означает ли это, что все остальные типы: User Initiated, Utility, Background будут иметь Background Thread, который не блокирует пользовательский интерфейс?

3, по ссылке Как создать очередь отправки в Swift 3 .В нем упоминается пара различных способов создания очереди отправки, некоторые из которых являются параллельными, а некоторые - последовательными.Также упоминается, что, назначая QOS с default или background, он гарантирует, что Queue имеет доступ к background threads.Но ничего подобного не упоминается в Serial и Concurrent.Интересно, они верны?

1 Ответ

0 голосов
/ 09 января 2019

Вы спрашиваете:

содержит ли нить только 2 типа: Основную нить и Фоновую нить?

Я не уверен, что опишу ихкак разные «типы», но с точки зрения разработчика приложения, да, есть «основной» поток, предназначенный для пользовательского интерфейса, основного цикла выполнения и т. д., и есть все другие потоки, которые, напротив, иопределение, «фоновые» потоки.

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

означает, что Фоновый поток означает, что все выполняемые задачи не будут блокироватьUI?

Эффективно, да.Но мы имеем дело с ограниченными ресурсами на наших устройствах, и поэтому разработчики должны быть разумными.Например, для наших фоновых задач мы хотим использовать QoS, соразмерный тому, что делает эта очередь.Или, если распараллелить какую-то задачу, нужно быть осторожным с ограничением степени параллелизма.Но если рассудить об использовании системных ресурсов и продолжать блокировать задачи из основной очереди, то это может обеспечить отзывчивый пользовательский интерфейс.

Итог, да, если у вас есть какой-то код, который блокирует потокна котором он выполняется (например, он требует больших вычислительных затрат, имеет блокирующие вызовы, такие как семафоры или группы рассылки wait и т. д.), вы обычно запускаете его в фоновом потоке, чтобы избежать блокировки основной очереди.

Поскольку в нем упоминается, что пользовательский интерактив является приоритетом выполнения задачи в главном потоке, чтобы избежать задержек пользовательского интерфейса, это означает, что все другие типы: инициируемые пользователем, служебные программы, фон будут иметь фоновый поток, который не имеетblock UI?

Это просто уровни качества обслуживания, которые являются относительными приоритетами для очередей.Это не вопрос «заблокировать пользовательский интерфейс» или «нет», а скорее вопрос о том, как GCD устанавливает приоритеты и распределяет ресурсы.

По ссылке «Как создать очередь отправки в Swift 3».В нем упоминается несколько различных способов создания очереди отправки, некоторые из которых являются параллельными, некоторые являются последовательными ...

Да

... В нем также упоминается, чтоприсваивая QOS по умолчанию или фону, это гарантирует, что очередь обращается к фоновым потокам ...

Это не совсем имеет смысла.Возможно, вы можете поделиться конкретной выдержкой из документов, и мы поможем вам интерпретировать то, что они пытались сказать.

... Но ничего подобного не упоминалось в последовательном и параллельном.Интересно, они правильные?

QoS - это просто вопрос приоритета и ресурсов для данной очереди.Serial vs concurrent - это просто вопрос того, ограничена ли очередь одним потоком за раз или она может использовать несколько потоков, когда это необходимо и доступно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...