Swift 并发的队列
此软件包公开了一个单一类型:AsyncQueue
。从概念上讲,AsyncQueue
非常类似于 DispatchQueue
或 OperationQueue
。然而,与这些不同的是,AsyncQueue
可以接受异步代码块。它的存在是为了更轻松地在非结构化任务之间强制执行顺序,而无需它们之间存在显式依赖关系。
我发现当将有状态的异步系统与同步代码连接时,这很有帮助。
如果您正在寻找处理 Actor 重入的帮助,请查看 Lock 和 Semaphore。
dependencies: [
.package(url: "https://github.com/mattmassicotte/Queue", from: "0.2.0")
]
let queue = AsyncQueue()
queue.addOperation {
await asyncFunction()
await anotherAsyncFunction()
}
// This can can also return the underlying Task,
// so you can cancel, or await a value
let task = queue.addOperation {
return await makeValue()
}
let value = try await task.value
默认情况下,AsyncQueue
一次只会运行一个操作。但是,它可以配置为并发队列。
let queue = AsyncQueue(attributes: [.concurrent])
// these two may run concurrently
queue.addOperation { await asyncFunction() }
queue.addOperation { await asyncFunction() }
// This will only run once existing operations are complete, and will
// prevent new operations from starting until done
queue.addBarrierOperation {
await asyncFunction()
}
AsyncQueue
类型具有 errorSequence
属性,该属性可用于带外检测未捕获的错误。
let queue = AsyncQueue(attributes: [.publishErrors])
Task {
for await error in queue.errorSequence {
print(error)
}
}
此软件包的灵感来自 Semaphore,这是另一个我发现非常有用的与并发相关的同步系统。
我非常乐意听取您的意见!问题或拉取请求都非常欢迎。Matrix space 和 Discord 均可提供实时帮助,但我强烈倾向于以文档的形式回答。您也可以在这里找到我 here。
我更喜欢协作,如果您有类似的项目,我很乐意找到合作方式。
我更喜欢使用制表符进行缩进以提高可访问性。但是,我更希望您使用您想要的系统并提交 PR,而不是因为空格而犹豫。
参与此项目即表示您同意遵守 贡献者行为准则。