2017-01-17 3 views
1

次の文を考えてみてください。単純な死の可能性はどのようにして順列を並べ替えることができますか?DispatchQueue QOS混乱

+1

DispatchQueue.globalのように見えます... –

+1

@Duncan 2つあります。 1つは非推奨、もう1つは非推奨です。 https://developer.apple.com/reference/dispatch/dispatchqueue – Verticon

+0

私はそれを考え出しました。 Derp ... –

答えて

2

一般的に、これらのすべての並べ替えを並べ替えるべきではありません。ほとんどの場合、あまりにも多くのQoSを混乱させることは、トラブルのレシピです。しかし、かなり単純なルールがあります。

キューには優先度があり、継承を要求するブロックに優先度を割り当てることができます。

この特定のブロックは明示的に低いプライオリティを要求していますが、「自分のQoS要求を無視します」と表示されます。原則として、そうしないでください。私がそれを行うために知っている唯一の理由は、QoSを理解していないいくつかのレガシーAPIとやり取りしている場合です。 (これは決して自分自身に遭遇したことはありません。ユーザレベルのコードでは想像するのは難しいです。)

さらに興味深い質問IMO(そして実際のコードではもっと頻繁に現れます)

DispatchQueue.global(qos: .utility).async(qos: .userInitiated) {} 

このブロックの優先度は?答えは.userInitiatedであり、ブロックは実行が終了するまでその優先度をキューに「ローン」します。だから、ある期間、このキュー全体は.userInitiatedになります。これは、優先度の逆転(高優先度タスクが低優先度タスクを待つブロック)を防止するためです。

これはすべて、些細なGCDに関心のある人にとっては必見の、Concurrent Programming With GCD in Swift 3に詳しく説明されています。

+1

ありがとう、ロブ。もう一度ビデオを試してみる。ちょっと私が最初に覚えていたのは:-) – Verticon

+0

最初はロブの答えを理解できませんでした。今私はそう思います。私はチャイムに戻ってきます。おそらくそれは私のような別の人を助けるでしょう。 DispatchQueueのQoSは、キューのサービス頻度を決定します。アイテムがキューからどのくらい素早く引き出され、スレッドに割り当てられ、したがって実行の候補になるか。 (これらのスレッドの優先順位は、さらに調査するための問題です)。 <次のコメントに続き> – Verticon

+0

.userInitiatedアイテムが送信されるときに、グローバルな.utilityキューに50個の.utilityアイテムがあるとします。キューのQOSを一時的に.userInitiatedに上げると、それがより頻繁にサービスされ、結果として50 "先行する"アイテムがより急速に取り除かれ、.userInitiatedアイテムが待ち行列からすぐに引き出されるされました。これは私の現在の理解です。学習を続けましょう。 – Verticon