【问题标题】:How can I get an equivalent to sync_channel(0) in `tokio`?如何在`tokio`中获得与sync_channel(0)等效的内容?
【发布时间】:2021-11-26 10:58:46
【问题描述】:

我有一个项目需要大量 IO 绑定线程(可能数百个),这使得 tokio 运行时比标准线程更理想。

但是,我还需要同时阻止发送方和接收方的集合通道。

std::sync::mpscsync_channel(0),但在 tokio::sync::mpsc 中没有等价物。 channel(0) 会恐慌。

如何将这两件事结合起来?标准频道还能用吗?

【问题讨论】:

  • 标准频道不等待,所以他们会阻止执行者。作为一种解决方法,您可以将频道操作包装在 tokio::task::spawn_blocking 中,即将 tx.send(message) 替换为 spawn_blocking(|| tx.send(message)).await
  • 你可以试试flume,它声称支持集合和异步通道。
  • 您在寻找Barrier 吗?您的问题不清楚
  • @Stargateur 障碍是您需要等待每个人达成共识的时候。它要求您知道对等点的数量,并且它不携带有效负载。集合通道只是一个不执行任何缓冲的有界通道。
  • @user4815162342 无论如何看起来都不是一件好事

标签: rust synchronization channels tokio


【解决方案1】:

标准库通道不可等待,因此它们会阻止执行程序。作为一种快速解决方法,您可以将频道操作封装在 tokio::task::spawn_blocking() 中,即将 tx.send(message) 替换为 spawn_blocking(|| tx.send(message)).await

更好的选择是使用支持异步集合通道的库,例如flume

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 2016-05-22
    • 2017-10-23
    • 1970-01-01
    • 2018-11-09
    • 2018-04-09
    • 2018-11-26
    相关资源
    最近更新 更多