fwc*_*wcd 7 concurrency actor swift swift-concurrency
考虑以下相对简单的 Swift 程序:
import Foundation
func printContext(function: String = #function, line: Int = #line) {
print("At \(function):\(line): Running on \(Thread.current) (main: \(Thread.isMainThread))")
}
printContext()
Task { @MainActor in
printContext()
}
Task.detached { @MainActor in
printContext()
}
Task {
await MainActor.run {
printContext()
}
}
DispatchQueue.main.async {
printContext()
}
dispatchMain()
Run Code Online (Sandbox Code Playgroud)
根据全球参与者的建议,我预计DispatchQueue.main.async { ...大致相当于Task.detached { @MainActor in ...。
然而,在 Swift 5.6.1 上arm64-apple-macosx12.0,该程序似乎在调用时不确定地产生不同的结果。有时我会得到预期的输出:
At main:7: Running on <_NSMainThread: 0x600000083c80>{number = 1, name = main} (main: true)
At main:10: Running on <_NSMainThread: 0x600000083c80>{number = 1, name = main} (main: true)
At main:19: Running on <_NSMainThread: 0x600000083c80>{number = 1, name = main} (main: true)
At main:14: Running on <_NSMainThread: 0x600000083c80>{number = 1, name = main} (main: true)
At main:24: Running on <_NSMainThread: 0x600000083c80>{number = 1, name = main} (main: true)
Run Code Online (Sandbox Code Playgroud)
有时@MainActor闭包似乎在另一个线程上执行:
At main:7: Running on <_NSMainThread: 0x600002ae44c0>{number = 1, name = main} (main: true)
At main:24: Running on <_NSMainThread: 0x600002ae44c0>{number = 1, name = main} (main: true)
At main:10: Running on <NSThread: 0x600002afff00>{number = 2, name = (null)} (main: false)
At main:19: Running on <NSThread: 0x600002afff00>{number = 2, name = (null)} (main: false)
At main:14: Running on <NSThread: 0x600002afff00>{number = 2, name = (null)} (main: false)
Run Code Online (Sandbox Code Playgroud)
只有该DispatchQueue机制似乎可以可靠地调度到main线程上。我是否误解了并发模型的一部分,或者为什么程序会这样?
小智 -1
是的,async/await 抽象了线程。在幕后,有一个线程池,当您运行任务时,您基本上是说,当有可用时间(并给予优先级)时,运行此代码。您的代码可能会在一个线程上挂起,然后在同一任务中的另一个线程上恢复。
因此,任务中运行的代码可以在随机线程上运行。要在主线程上运行代码,您需要使用await MainActor.run. 否则,你没有任何保证。
| 归档时间: |
|
| 查看次数: |
2110 次 |
| 最近记录: |