Swift 会话是一个 Swift 包,它实现了二进制会话类型,为确保并发系统中安全和结构化的通信提供了一个强大的框架。
该库目前支持以下功能
该库是作为卡梅利诺大学学士学位论文项目的一部分开发的。 该项目由 Alessio Rubicini 在 Luca Padovani 教授的指导下完成。
该库提供两种不同的会话类型管理风格
带有闭包的延续:协议延续作为闭包传递。 这种方法使逻辑流程在闭包上下文中清晰易懂。 它对于简单的通信序列特别有用。
await Session.create { e in
// One side of the communication channel
await Session.recv(from: e) { num, e in
await Session.send(num % 2 == 0, on: e) { e in
Session.close(e)
}
}
} _: { c in
// Another side of the communication channel
await Session.send(42, on: e) { e in
await Session.recv(from: e) { isEven, e in
Session.close(e)
}
}
}
带有端点传递的延续:这种风格涉及从通信原语返回延续端点。 它提供了更大的灵活性,能够实现更模块化和可重用的代码,尤其适用于复杂的通信序列。
typealias Protocol = Endpoint<Empty, (Int, Endpoint<(Bool, Endpoint<Empty, Empty>), Empty>)>
// One side of the communication channel
let e = await Session.create { (e: Protocol) in
let (num, e1) = await Session.recv(from: e)
let e2 = await Session.send(num % 2 == 0, on: e1)
Session.close(e2)
}
// Another side of the communication channel
let e1 = await Session.send(42, on: e)
let (isEven, e2) = await Session.recv(from: e1)
Session.close(e2)
每种风格都提供了一种独特的处理基于会话的二进制通信的方法,并且各有优缺点。 通过支持这两种风格,SwiftSessions 允许您根据您的需求和编码偏好选择最佳方法(或以混合方式使用两者!)。
有关其他示例,请参见 Tests 文件夹。
除了创建像之前的示例中那样的一次性会话之外,您还可以使用客户端/服务器架构风格来初始化会话。
服务器负责创建和管理多个可以处理特定协议的会话。 可以生成许多客户端并与同一服务器一起使用,以根据定义的协议进行对偶交互。 这允许我们只定义一次协议的一侧,并根据需要多次使用它。
// Server side
let server = await Server { e in
await Session.recv(from: e) { num, e in
await Session.send(num % 2 == 0, on: e) { e in
Session.close(e)
}
}
}
// Client side
let c1 = await Client(for: server) { e in
await Session.send(42, on: e) { e in
await Session.recv(from: e) { isEven, e in
Session.close(e)
}
}
}
// You can spawn more clients here...
这种架构适用于多个客户端需要与单个服务器交互的场景。 它也适用于实现涉及循环和递归的复杂协议。
Swift 6.0 将引入新功能,例如 noncopyable generics,这将显着增强该库的功能,从而实现静态线性检查。
要将 SwiftSessions 集成到您的项目中,请使用 Swift Package Manager。
Package.swift
文件中dependencies: [
.package(url: "https://github.com/alessiorubicini/SwiftSessions.git", .upToNextMajor(from: "1.0.0"))
]
SwiftSessions
添加到您的目标依赖项中.target(
name: "YourTargetName",
dependencies: [
.product(name: "SwiftSessions", package: "SwiftSessions")
]
)
此项目根据 MIT 许可证获得许可。 有关更多详细信息,请参见 LICENSE 文件。