首页 > 解决方案 > 同步/异步互操作通道

问题描述

当您希望跨线程(以线程阻塞方式)发送一系列事物时,您有例如crossbeam_channel. 当您希望跨期货发送一系列事物时(以非线程阻塞、未来阻塞的方式),您有例如tokio::sync::mpsc.

什么能让我从阻塞线程发送,并从异步上下文接收?(顺便说一句,我可以想象在某些时候需要相反的情况。)

我需要限制通道,发送时线程阻塞,接收时阻塞未来。

我正在寻找一些高性能的东西,比如相当于在 中所做的crossbeam_channel,但是唤醒未来而不是线程,能够缓冲一些消息以避免尽可能多的阻塞。此处针对多消息场景给出的答案看起来有点像这方面的修补程序。

标签: asynchronousrustsynchronous

解决方案


自从提出此问题以来,Tokio 提供的频道已获得执行此操作的功能。当您在非异步代码中时,您可以简单地调用通道上的blocking_sendand方法:blocking_recv

let (mut tx, mut rx) = tokio::sync::mpsc::channel(10);

std::thread::spawn(move || {
    // send a value, blocking synchronously
    // this allows async channels to be used in non-async contexts
    tx.blocking_send("testing").unwrap();
});

// receive a value, blocking asynchronously
assert_eq!(rx.recv().await.unwrap(), "testing");

推荐阅读