Свифт диспетчерских очередей асинхронный порядок выполнения - PullRequest
0 голосов
/ 04 марта 2019

Учитывая этот тривиальный фрагмент кода

DispatchQueue.global().async {
    print("2")
}

print("1")

, можно сказать, что вывод будет следующим:

1
2

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

1 Ответ

0 голосов
/ 05 марта 2019

Вы сказали:

мы можем сказать, что результат будет следующим:

Нет, в лучшем случае вы можете только сказать, что выход будет часто /часто в таком порядке, но это не гарантируется.

Фрагмент кода отправляет код асинхронно в глобальную параллельную очередь, которая запускает его в отдельном рабочем потоке, и, при отсутствии какой-либо синхронизации, вы получаете классическое условие состязания между текущим потоком иэтот рабочий поток.Вы не можете гарантировать последовательность этих print утверждений, хотя на практике вы часто будете видеть 1 до 2.

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

Ваше понимание верно, что последовательность этих двух print утверждений определенно не гарантируется.

Существуют ли обстоятельства, при которых порядок выполнения будет другим

Пара соображений:

  1. Путем корректировки приоритетов очереди, например,Вы можете изменить вероятность того, что 1 появится до 2.Но, опять же, это не гарантировано.

  2. Существует множество механизмов для гарантии заказа.

    • Вы можете использовать последовательную очередь ... Я понимаюВы не хотели использовать другую / другую очередь, но это, как правило, правильное решение, поэтому любое обсуждение этой темы было бы неполным без этого сценария;
    • Вы можете использовать группу рассылки ... вы можетеnotify в глобальной очереди, когда текущая очередь удовлетворяет группе;
    • Вы можете использовать семафоры отправки ... семафоры - классический ответ на вопрос, но семафоры ИМХО следует использовать экономно, так как это легко сделатьошибки ... плюс блокировка потоков никогда не бывает хорошей идеей;
    • Ради полноты следует отметить, что вы действительно можете использовать любой механизм синхронизации , например блокировки.
...