0.1.2 2019年6月12日
0.1.1 2019年6月12日
0.1.0 2019年6月11日

#20 in #最终一致性

MIT/Apache

17KB
243

evc

Docs.rs Build Status

一个无锁(当读取时),最终一致性同步原语。

该原语使得读写可以同时进行,尽管需要刷新以使写入对读者可见。

此crate与evmap非常相似,但已推广到任何类型。与包装HashMap的evmap不同,evc是更低级的,这意味着您需要能够缓存内部类型(OperationCache)上所有可能的突变。因此,建议创建一个扩展trait并为WriteHandle<YourType>实现它,这样就可以使用常规方法(如evmap内部所做的那样)访问内部数据。

示例

VecWrapper

use evc::OperationCache;

#[derive(Clone, Debug, Default)]
struct VecWrapper(Vec<u16>);

#[derive(Clone, Copy, Debug)]
enum Operation {
    Push(u16),
    Remove(usize),
    Clear,
}

impl OperationCache for VecWrapper {
    type Operation = Operation;

    fn apply_operation(&mut self, operation: Self::Operation) {
        match operation {
            Operation::Push(value) => self.0.push(value),
            Operation::Remove(index) => { self.0.remove(index); },
            Operation::Clear => self.0.clear(),
        }
    }
}

let (mut w_handle, r_handle) = evc::new(VecWrapper::default());

w_handle.write(Operation::Push(42));
w_handle.write(Operation::Push(24));

assert_eq!(r_handle.read().0, &[]);

w_handle.refresh();

assert_eq!(r_handle.read().0, &[42, 24]);

w_handle.write(Operation::Push(55));
w_handle.write(Operation::Remove(0));
w_handle.refresh();

assert_eq!(r_handle.read().0, &[24, 55]);

w_handle.write(Operation::Clear);

assert_eq!(r_handle.read().0, &[24, 55]);

w_handle.refresh();

assert_eq!(r_handle.read().0, &[]);

许可证

根据您的选择,受以下任何一个许可证的许可:

贡献

除非您明确声明,否则根据Apache-2.0许可证定义,您提交的任何有意包含在作品中的贡献,将根据上述许可证双重许可,没有任何附加条款或条件。

无运行时依赖