想写个简单的对象存储,折腾了两天大框写好了,结果一试,600M的稳健用了102秒,上网一查,这好像还不是个例, tokio::fs里面的东西好像普遍性能低下,而且低的不是一点半点。记得原来看的某篇文章里提过一句,说windows是有原生的异步磁盘操作的, linux下没有,不知道跟这个有没有关系。
想着用std::fs来替换,但是自己定的trait是围绕Stream来的,换的话等于推翻重写。思索在三,决定自己试着实现个Stream试一下。
先说Stream的定义:
pub trait Stream {
type Item;
fn poll_next(
self: Pin<&mut Self>,
cx: &mut Context<'_>
) -> Poll<Option<Self::Item>>;
}
跟Future差不多,只是有细微的差别,重点是对于返回值的定义,除了Ready(Some(Item))和Pending之外,还有个Ready(None)用来告诉调用者,所有内容都读取完毕了。别再poll我了。
以下是实现代码:
impl<T> MyStream<T>
where
T: std::io::Read + Send + Sync,
{
fn new(reader: T) -> Self {
Self {
inner: Arc::new(Mutex::new(reader)),
cap: 1024 * 8,
res: Arc::new(Mutex::new(None)),
sig_tx: None,
}
}
fn with_capacity(reader: T, cap: usize) -> Self {
Self {
inner: Arc::new(M

面对tokio::fs模块在处理大文件时的性能问题,作者决定自行实现Stream以提高效率。文章介绍了Stream的定义,即类似Future但增加了Ready(None)状态来指示结束。作者创建了一个线程读取Reader并将结果写入Stream,使用Waker唤醒线程并利用mpsc通道避免数据覆盖。尽管过程中遇到channel的多生产者单消费者特性以及编译器对Box<Fn>和generic type的要求,作者成功实现了自定义Stream来优化异步磁盘操作。
最低0.47元/天 解锁文章
626

被折叠的 条评论
为什么被折叠?



