自定义执行器:突破Actor隔离的并行计算
深入Swift并发中的自定义SerialExecutor,实现细粒度的任务调度与资源隔离。 · 难度:入门 · +10XP
自定义执行器与Actor隔离
Swift的Actor模型默认使用全局共享的协作线程池。但在高性能计算或UI线程绑定时,你需要自定义执行器来控制任务在哪个线程/队列上运行。本教程将手把手实现一个绑定到特定DispatchQueue的SerialExecutor,并展示如何用它创建拥有独立调度策略的Actor,从而避免主线阻塞与资源竞争。
import Dispatch
final class MyQueueExecutor: SerialExecutor {
private let queue: DispatchQueue
init(label: String, qos: DispatchQoS = .default) {
queue = DispatchQueue(label: label, qos: qos)
}
func enqueue(_ job: UnownedJob) {
queue.async {
job.runSynchronously(on: self.asUnownedSerialExecutor())
}
}
func asUnownedSerialExecutor() -> UnownedSerialExecutor {
UnownedSerialExecutor(ordinary: self)
}
}
actor CustomActor {
let executor: MyQueueExecutor
nonisolated var unownedExecutor: UnownedSerialExecutor {
executor.asUnownedSerialExecutor()
}
init(executor: MyQueueExecutor) {
self.executor = executor
}
func work() -> String {
return "Running on: \(Thread.current)"
}
}