威尼斯 (Venice) 为 Swift 提供 结构化并发 和 CSP 。
威尼斯 (Venice) 封装了 C 语言库 libdill 的一个 fork。
在使用 Venice 之前,您需要安装我们的 libdill fork。请按照您操作系统的说明进行操作。
在 macOS 上,使用 brew 安装 libdill。
brew install zewo/tap/libdill
在 Linux 上,我们必须首先添加我们的 apt 源。您只需要在您的生命周期内运行此命令一次。如果已经运行过,则无需再次运行。
echo "deb [trusted=yes] http://apt.zewo.io ./" | sudo tee -a /etc/apt/sources.list
sudo apt-get update
现在只需安装 libdill apt 包即可。
sudo apt-get install libdill
安装 libdill 后,只需将 Venice
作为依赖项添加到您的 Package.swift
文件中。
import PackageDescription
let package = Package(
dependencies: [
.Package(url: "https://github.com/Zewo/Venice.git", majorVersion: 0, minor: 19)
]
)
最内圈是整个项目,从中心向外移动是文件夹,最后是单个文件。每个切片的大小和颜色分别由语句的数量和覆盖率表示。
您可以查看 Venice API 参考 以获取更深入的文档。
结构化并发意味着并发函数的生命周期是整洁嵌套的。 如果协程 foo
启动协程 bar
,则 bar
必须在 foo
完成之前完成。
这不是结构化并发
这是结构化并发
结构化并发的目标是保证封装。 如果 main
函数调用 foo
,而 foo
又以并发方式启动 bar
,则 main
将保证一旦 foo
完成,就不会有剩余的函数仍在后台运行。
最终得到的是一个以 main
函数为根的协程树。 这棵树向最小的工作函数延伸,您可以将其视为调用堆栈的概括——如果愿意,可以将其视为调用树。 在其中,您可以从任何特定函数向根方向走,直到到达 main 函数
Venice 通过允许您取消正在运行的协程来实现结构化并发。
let coroutine = try Coroutine {
let resource = malloc(1000)
defer {
free(resource)
}
while true {
try Coroutine.wakeUp(100.milliseconds.fromNow())
print(".")
}
}
try Coroutine.wakeUp(1.second.fromNow())
coroutine.cancel()
当协程被取消时,所有协程阻塞调用都将开始抛出 VeniceError.canceledCoroutine
。 一方面,这迫使函数快速完成(没有协程阻塞函数,您无能为力); 另一方面,它提供了清理的机会。
在上面的例子中,当调用 coroutine.cancel
时,协程内部对 Coroutine.wakeUp
的调用将抛出 VeniceError.canceledCoroutine
,然后 defer
语句将运行,从而释放为 resource
分配的内存。
您可以在多线程程序中使用 Venice。 但是,各个线程是严格分离的。 您可以将每个线程视为一个单独的进程。
特别是,在线程中创建的协程将在同一线程中执行,并且永远不会迁移到不同的线程。
类似地,在一个线程中创建的句柄(例如通道或协程句柄)不能在不同的线程中使用。
本项目已根据 MIT 许可证发布。 有关详细信息,请参见 LICENSE。