Build Status Platforms Documentation Matrix

队列

Swift 并发的队列

此软件包公开了一个单一类型:AsyncQueue。从概念上讲,AsyncQueue 非常类似于 DispatchQueueOperationQueue。然而,与这些不同的是,AsyncQueue 可以接受异步代码块。它的存在是为了更轻松地在非结构化任务之间强制执行顺序,而无需它们之间存在显式依赖关系。

我发现当将有状态的异步系统与同步代码连接时,这很有帮助。

如果您正在寻找处理 Actor 重入的帮助,请查看 LockSemaphore

集成

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 spaceDiscord 均可提供实时帮助,但我强烈倾向于以文档的形式回答。您也可以在这里找到我 here

我更喜欢协作,如果您有类似的项目,我很乐意找到合作方式。

我更喜欢使用制表符进行缩进以提高可访问性。但是,我更希望您使用您想要的系统并提交 PR,而不是因为空格而犹豫。

参与此项目即表示您同意遵守 贡献者行为准则