我希望实现position_io2的ReadAt
特性,该特性提供了一个&mut [u8]
缓冲区,可以针对一个API写入,该API可以接受针对特定固定大小的512 KB块的并行请求。
问题是我不能保证读取的位置会与这些块边界之一对齐,因此我需要为每个下载闭包提供一个完整缓冲区的切片来写入。
原始方法会导致错误-cannot borrow *buf as mutable more than once at a time
:
for SnapshotBlock { index, token } in blocks {
let mut bufOffset: usize = ((index - start_block) * block_size) as usize - start_block_offset;
let mut bufSize: usize = block_size as usize;
block_contexts.push(BlockContext {
output_buffer: &mut buf[bufOffset..(bufOffset+bufSize)],
block_index: index,
block_token: token,
block_size,
})
}
我可以看到一堆处理静态块大小的API-例如buf.as_chunks_mut()
,但最接近我的问题的是buf.align_to()
,它在一个元组中返回三个切片,但这只适用于类型,而不是像这样的大块。
是否有任何库或其他方法可以为每个下载线程提供可变切片,或者我需要使用不安全代码来实现这一点?
1条答案
按热度按时间b09cbbtk1#
可以使用
chunks_mut()
将切片划分为连续的块。