🔖
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 5
✅ Done 📕 high
✅ Done 🔥 userInitiated
👨 medium step 5
✅ Done 👨 medium
⛰️ low step 5
🔧 utility step 5
✅ Done ⛰️ low
✅ Done 🔧 utility
🌙 background step 5
✅ Done 🌙 background
Discussion