#mpsc #wrapper #dynamic #fifo

any-mpsc

允许任意类型通过的多生产者单消费者(mpsc)

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次

MIT/Apache

20KB
378

any-mpsc

mpsc::channel 的包装器,允许通过任意类型。有2种不同的版本。

any_mpsc::channel

可以使用 any_mpsc::channel 函数创建一个基本的 (AnySender, AnyReceiver)AnySender 接受任何值,并通过底层的通道使用 send 方法(内部作为 Box<dyn Any>)发送。 AnyReceiver 包含了 recvrecv_timeouttry_recv 的泛型版本。如果提供的泛型参数与 AnySender 推送的类型不匹配,将返回包含值的 AnyRecvError::WrongType(Box<dyn Any>)

any_mpsc::buffered_channel

可能更有用,buf_recv 默认功能启用了 any_mpsc::buffered_channel 函数。这将返回一个 (AnySender, BufferedReceiver)。与 AnyReceiver 不同,BufferedReceiver 在提供不匹配的泛型类型时,将返回一个 AnyRecvError::BufRecvError(TypeId)。实际值将存储在其内部缓冲区中,下次调用 recvrecv_timeouttry_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