簡體   English   中英

Task.detached 的默認優先級

[英]Default priority of Task.detached

當您使用detached(priority:operation:)創建一個分離任務但將priority設置為 nil 時,iOS 分配什么優先級?

例如,假設照片 output 處理程序調用這樣的演員:

class PhotoViewController: UIViewController {
    func photoOutput(_ photoOutput: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
        let photoWithContext = someCallToMainActor(photo)
        Task.detached {
            let result = async someCallToAnotherActor(photoWithContext)
            async anotherCallToMainActor(result)
        }
    }
}

detached(priority:operation:) 的文檔提到了優先級,“你需要通過一個分離的任務手動處理這些考慮。” 由於分離的任務不是子任務,我沒有得到“子任務繼承父任務的優先級”的功能。

我意識到我可以明確指定優先級。 盡管如此, detached(priority:operation:) 允許優先級為零可能是有原因的,並且人們會期望一個定義良好的語義。 是否有任何規則來管理分離任務的優先級?

對於子任務,任務的優先級是從父任務繼承的,對於分離任務和父任務,如果提供的優先級為nil ,則使用TaskPriority.medium作為優先級。

TL&DR; 沒有指定優先級的分離任務最終具有.medium優先級,至少在編寫此答案時這是正確的。 未來可能會發生變化,但不確定這一變化的可能性有多大。


Swift 的眾多優點之一是它是開源的,因此我們可以看看引擎蓋下發生了什么。

如果我們看一下Task.detached()實現,我們可以看到以下代碼:

public static func detached(
  priority: TaskPriority? = nil,
  operation: __owned @Sendable @escaping () async -> Success
) -> Task<Success, Failure> {
#if compiler(>=5.5) && $BuiltinCreateAsyncTaskInGroup
  // Set up the job flags for a new task.
  let flags = taskCreateFlags(
    priority: priority, isChildTask: false, copyTaskLocals: false,
    inheritContext: false, enqueueJob: true,
    addPendingGroupTaskUnconditionally: false)

優先級被傳遞給taskCreateFlags() function,目前看起來像這樣:

func taskCreateFlags(
  priority: TaskPriority?, isChildTask: Bool, copyTaskLocals: Bool,
  inheritContext: Bool, enqueueJob: Bool,
  addPendingGroupTaskUnconditionally: Bool
) -> Int {
  var bits = 0
  bits |= (bits & ~0xFF) | Int(priority?.rawValue ?? 0)

  ...
}

因此,如果priority參數為 nil,則表示優先級的任務標志的第一個字節將為零。

現在,如果我們繼續挖掘,我們會到達編譯器區域,在某個時候我們會到達Task.cpp:755 ,它的內容如下

if (isUnspecified(basePriority)) {
   basePriority = JobPriority::Default;
}

,因此JobPriority::Default對應於值0x15 ,無論是否巧合,正如其他人所注意到的那樣,它對應於.medium任務優先級。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM