Swift 在 Swift 5.5 中添加了它自己的 Swift 并发模型。 如果您不熟悉它,您可能应该先阅读它。 如果在那之后您仍然有兴趣学习 Flynn,请继续 :)

快速开始

Swift 包管理器

要使用 Flynn,请确保您使用的是 Swift 5.6 或更高版本,并对您的 Package.swift 进行以下更改

添加到您的 Package

dependencies: [
    .package(url: "https://github.com/KittyMac/Flynn.git", from: "0.3.0"),
]

添加到所需 Target

.target(
	...
	dependencies: [
		"Flynn"
	],
	plugins: [
		.plugin(name: "FlynnPlugin", package: "Flynn")
	]
)

Actor-Model 编程

Flynn 将 Actor-Model 编程移植到 Swift 上,为您的高度并发的 Swift 代码提供安全性和性能。 Flynn 很大程度上受到了 Pony 编程语言的启发。 这是您需要了解的

Actor 是并发安全的 Swift 类

使用 Actor 来分离并发逻辑可以提供安全性、性能和效率。

class ConcurrentDatastore: Actor {
  // Everything inside this actor is safe and cannot
  // be accessed concurrently by any other thread
  private var storage: [String: String] = [:]
  
  ...
}

Behaviors 是异步方法调用

Actor 提供 behaviors(在调用站点看起来像普通的方法调用),这些 behaviors 从调用者的角度异步执行。

let datastore = ConcurrentDatastore()
datastore.beStore("SomeKey", "SomeValue")

从 Actor 的角度来看,behaviors 同步执行(与它们为调用代码发送的顺序相同)。

class ConcurrentDatastore: Actor {
  ...
  // Behaviors are called asynchronously but execute synchronously on the Actor
  internal func _beStore(_ key: String, _ value: String) {
    storage[key] = value
  }
}

Actor 在调度器上运行

与其他将 Actor-Model 编程引入 Swift 的尝试不同,Flynn 不使用 DispatchQueues。 相反,Flynn 包含一个修改版本的 Pony 语言运行时。 这使得 Flynn 中的 Actor 比 DispatchQueues 轻量得多; 您可以拥有数百万个 Actor,它们可以非常高效地相互发送消息。

编译时的并发警告和错误

Flynn 库提供了更安全并发的机制,FlynnPlugin 将在编译时帮助您确保安全。 这通过不允许不安全的代码编译来使您远离无数的并发陷阱

在这个例子中,我们在我们的 Counter Actor 上有一个公共变量。 不允许使用公共变量,因为它们可能从其他线程访问,从而破坏 Actor-Model 范例为我们提供的并发安全性。

远程 actors 是在其他地方运行的 actors

RemoteActors 是一个高级主题,可能只对一部分开发人员有用。

从 v0.2 开始,Flynn 有一种新的 Actor,即 RemoteActor。 RemoteActors 的行为与 Actors 类似; 它们具有并发安全的内部状态,您可以通过调用 behaviors 与它们交互。 RemoteActors 旨在在您的正常 Flynn 环境之外执行,通常是在不同机器上运行的另一个进程中。 由于 RemoteActors 在其他地方运行,因此它们比普通 Actors 更严格(例如,您不能选择不安全地公开对 RemoteActors 的访问)。 请参阅 RemoteActor 文档了解更多详情。

文档

Actors - 并发安全的 Swift 类
Behaviors - 异步方法调用
调度 - Actors 如何以及何时执行 Behaviors
FlynnPlugin - 防止数据竞争和其他不良情况
Flowable Actors - 易于链接的 actors 网络
Flynn.Timer - Actor 友好的定时器
RemoteActors - 在另一个进程中运行 actors

与 Swift 并发共存 - 与 async/await 和平共处

示例

Hello World - 你猜对了!
简单 HTTP 服务器 - 用于 HTTP 连接的 Actors,作为服务的 Actors

项目

Starbase Orion 10 - 4X 太空策略游戏
Jukebox - 用于运行自制 Alexa 驱动的点唱机的 Linux 守护程序
Cutlass - 使用 Flynn、YogaMetal 的完全并发用户界面

产品

您是否发布了使用 Flynn 的东西? 告诉我们!

许可证

Flynn 是根据 MIT 许可条款分发的免费软件,如下所示。 Flynn 可用于任何目的,包括商业目的,绝对免费。 没有文书工作,没有版税,没有类似 GNU 的“著作权”限制。 只需下载并享受。

版权所有 (c) 2020 Chimera Software, LLC

特此授予任何人免费获得本软件及其相关文档文件(“软件”)副本的许可,以便不受限制地处理本软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售本软件的副本,并允许向获得本软件的人员提供以下条件

上述版权声明和本许可声明应包含在本软件的所有副本或实质性部分中。

本软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于适销性、特定用途适用性和不侵权的保证。 在任何情况下,作者或版权持有者均不对任何索赔、损害或其他责任负责,无论是在合同、侵权行为或其他方面,因本软件或本软件的使用或其他交易而引起、由此产生或与之相关的行为。