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
每月137次下载
56KB
635 行
Rust中的带时钟的调度服务
这个Rust包提供了一种带时钟的消息调度服务。带时钟的调度本质上是一组通道。不同之处在于每个通道都知道整个系统处理了多少条消息。这可以帮助不同的线程了解另一个线程的更新程度。
例如,假设消息 m
被发送到某个接收者 r
。另一个没有收到 m
的接收者 r'
,在它进行后续读取时,仍会意识到已调度了一条消息。
为了说明这有什么用,考虑两个通道对,一个在 s1
和 r1
之间,另一个在 s2
和 r2
之间。假设 r1
和 r2
有时需要通信。然而,它们希望等待直到对方看到它们已经收到的任何更新之前。假设 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 License,版本2.0(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
。
贡献
除非您明确说明,否则根据Apache-2.0许可证定义的,您有意提交给作品的所有贡献,都将按上述方式双许可,没有任何附加条款或条件。
依赖项
~315–540KB