🔖

Swift Concurrency⑥:Task Priority (.userInitiated, .background など)使ってみる

に公開

前回はTaskのPriorityとは?TaskのPriorityの種類を学習したので、
今日は実際にどんな挙動になるのか?
コードで試してみます。

おさらい

  • Task のpriority はタスクの優先度決める。

Task Priority の種類

    public static let high: TaskPriority

    public static var medium: TaskPriority { get }

    public static let low: TaskPriority

    public static let userInitiated: TaskPriority

    public static let utility: TaskPriority

    public static let background: TaskPriority

実際に優先度を決めたら処理はどうなるのか確認する

    func runTaskWithPriority(priority: _Concurrency.TaskPriority, name: String) {
    Task(priority: priority) {
        print("▶️ Start \(name) (\(priority))")
        // 1~5までプリントします
        for i in 1...5 {
            try? await Task.sleep(nanoseconds: 500_000_000) // 0.5秒待つ
            // このタスクがキャンセルされていたら、ここでエラーを投げて処理を中断する
            try? Task.checkCancellation()
            print("   \(name) step \(i)")
        }
        print("✅ Done \(name)")
    }
}


func testPriorities() {
    
    runTaskWithPriority(priority: .background, name: "🌙 background")
    
    runTaskWithPriority(priority: .userInitiated, name: "🔥 userInitiated")
    
    runTaskWithPriority(priority: .utility, name: "🔧 utility")
    
    runTaskWithPriority(priority: .high, name: "📕 high")
    
    runTaskWithPriority(priority: .low, name: "⛰️ low")
    
    runTaskWithPriority(priority: .medium, name: "👨 medium")
}

testPriorities()

結果

ちなみに結果は毎回変わりました。。なぜ。。
ChatGPTに聞いてみた。

結論から言うと「タスクの優先度は“順番保証”ではなく“ヒント”で、さらに並行処理の世界は本質的に非決定的だからです。なので、毎回ログの並びが変わるのは正常です。

なるほどシステムにタスクの優先度を伝えられるが、ヒント で必ずその優先度で処理が走るわけではないと言うことか。。

▶️ Start 🌙 background (TaskPriority.background)
▶️ Start 🔥 userInitiated (TaskPriority.high)
▶️ Start 📕 high (TaskPriority.high)
▶️ Start 👨 medium (TaskPriority.medium)
▶️ Start 🔧 utility (TaskPriority.low)
▶️ Start ⛰️ low (TaskPriority.low)
   🔥 userInitiated step 1
   📕 high step 1
   ⛰️ low step 1
   👨 medium step 1
   🔧 utility step 1
   🌙 background step 1
   👨 medium step 2
   📕 high step 2
   🔥 userInitiated step 2
   ⛰️ low step 2
   🔧 utility step 2
   🌙 background step 2
   🔥 userInitiated step 3
   👨 medium step 3
   📕 high step 3
   🔧 utility step 3
   ⛰️ low step 3
   🌙 background step 3
   📕 high step 4
   🔥 userInitiated step 4
   👨 medium step 4
   🔧 utility step 4
   ⛰️ low step 4
   🌙 background step 4
   📕 high step 5
   🔥 userInitiated step 5Done 📕 high
✅ Done 🔥 userInitiated
   👨 medium step 5Done 👨 medium
   ⛰️ low step 5
   🔧 utility step 5Done ⛰️ low
✅ Done 🔧 utility
   🌙 background step 5Done 🌙 background

次回 はActor と @MainActorとは?を学習します

Discussion