我有这样一个多线程读,单线程写的场景,使用了RWLock(标准库的和parking_lot都试过,效果差不多,这不是重点)。
let state = Arc::new(RwLock::new(MyStruct::new()));
当notify监听到文件变化时,重新初始化一个MyStruct
,然后重新赋值给正在被其他线程共享的这个
let new_state = MyStruct::new();
*state.write() = new_state;
这个MyStruct
其实是相当复杂的一个结构,我观测发现*state.write() = new_state;
这行代码会执行500多ms,那么这个语句应该是把新对象的内存复制到这个变量中去了,我在想有没有办法改成引用的方式,只改变指针的指向而不拷贝内存?
另外一个延伸的问题是,文件改变一次,但notify会监听到两次事件。。。
希望有大神可以帮忙指点迷津,多谢!!!
1
共 7 条评论, 1 页
评论区
写评论*state.write() = new_state;
感觉 500ms 是
*state.write()
获取锁需要的时间,一个结构如果大到需要 500ms 来做复制,那它的得非常大,一般情况下创建这种结构都很难试试,相比原来的,只是封了一层Box,主要区别在于new_state现在分配在堆上,那么赋值的时候就只需要改个指针了
Mutex里面再包一个Box?
notify会监听到两次事件这个问题我最近也遇到过,我用的两个 channel 做防抖
那你搞成静态全局变量不就好了,你非要with_state走extractor又有什么意义呢
--
👇
lovelock: 这个我之前尝试过,但它不支持
Clone
,我这个是需要一组线程用它的读实例,一个线程用它的写实例,而且是要传如axum的handler里的,它限制了必须要有Clone
https://docs.rs/arc-swap/latest/arc_swap/docs/limitations/index.html#no-clone-implementation
--
👇
Bai-Jinlin: https://docs.rs/arc-swap/
这个我之前尝试过,但它不支持
Clone
,我这个是需要一组线程用它的读实例,一个线程用它的写实例,而且是要传如axum的handler里的,它限制了必须要有Clone
https://docs.rs/arc-swap/latest/arc_swap/docs/limitations/index.html#no-clone-implementation
--
👇
Bai-Jinlin: https://docs.rs/arc-swap/
https://docs.rs/arc-swap/