跳到主要内容
英文版本为准

本页译自英文,由模型翻译。若与英文原文存在差异,以英文原文为准。

生命周期

FileBroker::new 记录路径,connect 打开文件,每个订阅打开一个读取者,shutdown 结束写入者;StdioBroker 在第一次使用时接上进程的管道。

文件 Broker 的三个状态作为类型,以及每次转换对流文件做什么Broker文件传输FileBroker::new(path)ConnectedFileBrokerClosed = ()没有要报告的记录路径和设置,无 I/O打开或创建文件;为空文件写入预置消息每个订阅:一个消费者,或一个重放读取者每次发布:追加并刷写等待发布完成,设置时写入结束标记,刷写,同步到设备之前保留的发布者返回 NotConnected,通过旧定位器的定位被拒绝
以文字阅读本图
  1. Broker: FileBroker::new (path); ConnectedFileBroker; Closed = () 没有要报告的
  2. 文件传输: 记录路径和设置, 无 I/O; 打开或创建 文件;为空文件 写入预置消息; 每个订阅: 一个消费者,或 一个重放读取者; 每次发布: 追加并刷写; 等待发布完成, 设置时写入结束标记, 刷写, 同步到设备
  3. FileBroker::new (path) → ConnectedFileBroker: connect(self)
  4. ConnectedFileBroker → Closed = () 没有要报告的: shutdown(self)
  5. 记录路径和设置, 无 I/O → 打开或创建 文件;为空文件 写入预置消息
  6. 打开或创建 文件;为空文件 写入预置消息 → 每个订阅: 一个消费者,或 一个重放读取者
  7. 每个订阅: 一个消费者,或 一个重放读取者 → 每次发布: 追加并刷写
  8. 每次发布: 追加并刷写 → 等待发布完成, 设置时写入结束标记, 刷写, 同步到设备
  9. 之前保留的发布者返回 NotConnected, 通过旧定位器的定位被拒绝

new 不做任何 I/O,所以服务的构建函数保持同步。运行时在应用启动时连接 Broker。文件不存在时,connect 会创建它;在 existing_only 下则会失败。connect 检查信标间隔,打开客户端的 streamer 和一个生产者,并向还没有任何内容的文件写入预置消息。

每个订阅在执行 connect 的运行时上打开它的读取者。实时订阅打开一个位于末端的消费者,重放则打开一个读取整个文件的读取者。发布追加并刷写,写入者一页用图说明了这一点。

关闭先把连接标为已关闭,因此在此之后开始的发布会失败。然后它等待在途的发布,并取出生产者。客户端结束该文件的写入者:设置了流结束标记时写入它,然后刷写,并把文件同步到设备。本 crate 在这之后才丢弃自己的生产者,并再次请求客户端。否则,一个晚丢弃的句柄会结束下一次连接到同一文件时的写入者。

关闭之后,之前保留的发布者返回 NotConnected,通过之前保留的定位器进行的定位会被拒绝。二者都不会对已关闭的文件报告成功。

stdio Broker​

stdio Broker 的三个状态作为类型,以及每次转换对进程的管道做什么Broker管道传输StdioBroker::new()ConnectedStdioBrokerClosed = ()没有要报告的记录 loopback,不碰任何管道第一个订阅:stdin 线程第一次发布:stdout 线程结束进程中的每个 stdio 流之前保留的发布者返回 NotConnected
以文字阅读本图
  1. Broker: StdioBroker::new(); ConnectedStdioBroker; Closed = () 没有要报告的
  2. 管道传输: 记录 loopback, 不碰任何管道; 第一个订阅: stdin 线程; 第一次发布: stdout 线程; 结束进程中的 每个 stdio 流
  3. StdioBroker::new() → ConnectedStdioBroker: connect(self)
  4. ConnectedStdioBroker → Closed = () 没有要报告的: shutdown(self)
  5. 记录 loopback, 不碰任何管道 → 第一个订阅: stdin 线程
  6. 第一个订阅: stdin 线程 → 第一次发布: stdout 线程
  7. 第一次发布: stdout 线程 → 结束进程中的 每个 stdio 流
  8. 之前保留的发布者返回 NotConnected

connect 记录 Broker 是否回环,不碰任何管道。进程中的第一个订阅启动客户端的 stdin 线程,第一次发布启动它的 stdout 线程,管道一页用图说明了这一点。两个线程服务于整个进程,因此关闭会结束其中的每个 stdio 消费者和生产者,包括其他 Broker 的。