6个版本
0.3.1 | 2021年7月19日 |
---|---|
0.3.0 | 2021年7月16日 |
0.2.1 | 2021年7月16日 |
0.1.3 | 2021年7月15日 |
777 在 异步 中排名
每月下载 27次
20KB
378 行
any-mpsc
为 mpsc::channel
的包装器,允许通过任意类型。有2种不同的版本。
any_mpsc::channel
可以使用 any_mpsc::channel
函数创建一个基本的 (AnySender, AnyReceiver)
。 AnySender
接受任何值,并通过底层的通道使用 send
方法(内部作为 Box<dyn Any>
)发送。 AnyReceiver
包含了 recv
、recv_timeout
和 try_recv
的泛型版本。如果提供的泛型参数与 AnySender
推送的类型不匹配,将返回包含值的 AnyRecvError::WrongType(Box<dyn Any>)
。
any_mpsc::buffered_channel
可能更有用,buf_recv
默认功能启用了 any_mpsc::buffered_channel
函数。这将返回一个 (AnySender, BufferedReceiver)
。与 AnyReceiver
不同,BufferedReceiver
在提供不匹配的泛型类型时,将返回一个 AnyRecvError::BufRecvError(TypeId)
。实际值将存储在其内部缓冲区中,下次调用 recv
、recv_timeout
或 try_recv
时,如果传入的泛型参数与其类型匹配,则将返回并从缓冲区中删除该缓冲值。存在与通道和缓冲区交互的附加方法,请参阅本节底部的表格。
示例
fn receive_handler<T: Debug + 'static>(rx: &mut BufferedReceiver)
{
match rx.recv::<T>()
{
Ok(result) => println!("{:?}", result),
Err(AnyRecvError::BufRecvError(type_id)) => println!("Type with id {:?} added to buffer", type_id),
Err(e) => eprintln!("{}", e)
}
}
let (tx, mut rx) = any_mpsc::buffered_channel();
tx.send(55.7f32)?;
tx.send(String::from("example"))?;
receive_handler::<f32>(&mut rx);
receive_handler::<f32>(&mut rx);
receive_handler::<String>(&mut rx);
输出如下
55.7
Type with id TypeId { t: 7854412396444247302 } added to buffer
"example"
方法 | 描述 |
---|---|
recv_until |
将连续接收,直到找到提供的泛型类型。任何不匹配的类型都将放置在缓冲区中。 |
recv |
尝试从内部缓冲区弹出。如果缓冲区为空,则调用 mpsc recv |
recv_timeout |
尝试从内部缓冲区弹出。如果缓冲区为空,则调用 mpsc recv_timeout |
try_recv |
尝试从内部缓冲区弹出。如果缓冲区为空,则调用 mpsc try_recv |
recv_live |
无论缓冲区是否为空,都调用 mpsc recv。不匹配的结果类型仍然会被放置在缓冲区中。 |
recv_timeout_live |
无论缓冲区是否为空,都调用 mpsc recv_timeout。不匹配的结果类型仍然会被放置在缓冲区中。 |
try_recv_live |
无论缓冲区是否为空,都调用 mpsc try_recv。不匹配的结果类型仍然会被放置在缓冲区中。 |
recv_nobuf |
等同于 AnyReceiver::recv (完全绕过缓冲区) |
recv_timeout_nobuf |
等同于 AnyReceiver::recv_timeout (完全绕过缓冲区) |
try_recv_nobuf |
等同于 AnyReceiver::try_recv (完全绕过缓冲区) |
recv_buf |
尝试从内部缓冲区弹出。决不尝试访问内部通道。 |
依赖关系
~13KB