#channel #dispatch #message #synchronization #send-message #message-sent #sync

弃用 clocked-dispatch

提供了一种带时钟的消息调度服务

17个稳定版本 (4个主要版本)

使用旧的Rust 2015

4.0.2 2018年12月4日
4.0.1 2017年1月30日
4.0.0 2016年10月25日
3.0.1 2016年7月21日
0.1.0 2016年4月25日

#7#message-sent

Download history 1/week @ 2024-03-26 7/week @ 2024-04-02 137/week @ 2024-07-02

每月137次下载

MIT/Apache

56KB
635

Rust中的带时钟的调度服务

Crates.io Documentation Build Status

这个Rust包提供了一种带时钟的消息调度服务。带时钟的调度本质上是一组通道。不同之处在于每个通道都知道整个系统处理了多少条消息。这可以帮助不同的线程了解另一个线程的更新程度。

例如,假设消息 m 被发送到某个接收者 r。另一个没有收到 m 的接收者 r',在它进行后续读取时,仍会意识到已调度了一条消息。

为了说明这有什么用,考虑两个通道对,一个在 s1r1 之间,另一个在 s2r2 之间。假设 r1r2 有时需要通信。然而,它们希望等待直到对方看到它们已经收到的任何更新之前。假设 r1 已经看到了7个更新,但 r2 没有看到任何。r2 是否已经足够更新?嗯,这可能——系统中的所有通道发送都可能只是为了 r1

带时钟的调度通过引入一个共享调度器,并为所有消息分配单调递增的序列号来简化。它看起来像这样

  s1       s2
   +---+----+
       |
       + dispatcher
       |
   +---+----+
  r1       r2

s1 想要将消息 m 发送到 r1 时,它实际上是将 m 发送到调度器。调度器为 m 分配一个序列号,将其转发到 r1然后将时钟更新发送到 r2。这个时钟更新允许 r2 在上述场景中看到有7个更新已经通过它,这告诉它它已经看到了 r1 所看到的所有更新。

分发器引入了另一个微妙的问题。具体来说,如果 r2 接受更新速度慢,那么它在尝试发送时钟更新时可能会阻塞分发器。为了避免这种情况,库实现了一个自定义通道,用于传输这些序列号而不会阻塞发送者。如果正在发送消息,则仍会发生阻塞,但时间戳更新不会阻塞分发器。这意味着即使 r2 目前没有从其输入通道读取,s1.send(v) 也不会阻塞。

可以使用 forward 代替 send 来组合时钟分发实例,用于已经分配了序列号的消息。库确保这些消息按顺序传递,通过延迟发送消息,直到可以保证没有更早的消息后来到达。有关此操作模式的详细信息,请参阅crate文档。

待办事项

  • 避免图中的一条慢路径阻塞通过独立路径的发送。这可以通过不为所有发送到分发器的发送者共享单个通道来实现。相反,分发器应该为每个发送者有一个单独的通道,并在那些接收者缓冲区有空间的情况下进行选择。除非我们切换到外部通道库,否则这将在rust#27800上阻塞。

许可证

根据您的选择,许可如下

贡献

除非您明确说明,否则根据Apache-2.0许可证定义的,您有意提交给作品的所有贡献,都将按上述方式双许可,没有任何附加条款或条件。

依赖项

~315–540KB