【问题标题】:Is there an inbuilt or canonical way in Rust to ‘publish’ state?Rust 中是否有内置或规范的方式来“发布”状态?
【发布时间】:2021-10-22 21:40:27
【问题描述】:

Rust 中是否有任何规范的方式来发布频繁更新的“状态”,这样任意数量的消费者都可以在不提供对对象本身的访问权限的情况下读取它?

我的用例是我有一个通过 Web 套接字传入的信息流,并希望有聚合的指标可供其他线程使用。可以在外部使用 Kafka 之类的东西来执行此操作,我可能会推出自己的内部解决方案,但想知道是否还有其他方法?

我在 Go 中使用的另一种方法是让消费者向生产者注册自己并每个接收一个频道,生产者只需单独发布到每个频道。通常会有少量消费者,所以这可能会很好,但想知道是否有更好的方法。

【问题讨论】:

    标签: multithreading rust concurrency channels


    【解决方案1】:

    听起来你想要一个“广播频道”。

    如果您使用async,流行的tokio crate 在他们的sync::broadcast 模块中提供了一个实现:

    一个多生产者、多消费者的广播队列。每个发送的值都会被所有消费者看到。

    Sender 用于将值广播到所有连接的Receiver 值。 Sender 句柄是可克隆的,允许并发发送和接收操作。 [...]

    [...]

    新的Receiver 句柄是通过调用Sender::subscribe 创建的。返回的Receiver 将接收调用subscribe 后发送的值。

    如果这不太符合您的喜好,还有其他提供类似类型的 crate,可以通过在 crates.io 上搜索 "broadcast" 找到。

    【讨论】:

    • 啊哈,在我的脑海中,这些渠道是“第一个阅读的消费者得到它,没有其他人”。这样就完美了!
    猜你喜欢
    • 2022-01-17
    • 2012-12-05
    • 2020-01-17
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多