我有两个线程,它们从两个源读取消息流,然后将它们转发到第三个接收器,在那里它们按顺序进行处理。我关心的是复制数据的开销,因为我的消息在每个线程的堆栈上,要通过mpsc移动它们,必须将每一位复制到接收器的堆栈上。如果我试图通过将消息放在Box中来缓解这种情况,那么只有指针会被发送到新堆栈,但仍然会从源堆栈复制到堆。我不完全确定我的消息是在堆上还是在堆栈上,因为前几天我在rust-lang.org上看到一篇博客文章,声称vec![1,2,3]存在于堆栈上,如果是真的,我不会猜到。
mpsc
Box
vec![1,2,3]
dzhpxtsq1#
我也有类似的担忧,但没有找到令人满意的答案,但我有一些逻辑可以帮助解决这些担忧。关于开销,使用MPSR通道是Rust中进行并发的推荐方法(消息传递被提升为一种安全特性,比使用Arc指针和互斥体的直接共享更不容易出错)。虽然我们可以预期它会有一些开销,我们也可以相信Rust团队推荐它作为多线程的标准方法是有原因的-他们重视速度。在所有的可能性中,开销非常低,我怀疑在幕后你只是改变了所有权(因为在硬件级别上,所有线程都可以以多个进程所不能的方式访问同一内存)。所以基本上,Rust使用智能指针进行多处理,传递消息时唯一需要改变的是指针的所有权,以及堆上的底层数据。但是大:我发现了一个名为“bus”的机箱,它是一个基于MPSC代码的单生产者多消费者系统。它有一个已知的高CPU使用率问题(https://github.com/jonhoo/bus/issues/23)。我没有发现MPSC有类似的问题,但我确实发现了关于内存的投诉(https://users.rust-lang.org/t/mpsc-channels-high-memory-usage/78651/5)。虽然阅读了回复,我不认为这是你需要担心的问题。
1条答案
按热度按时间dzhpxtsq1#
我也有类似的担忧,但没有找到令人满意的答案,但我有一些逻辑可以帮助解决这些担忧。
关于开销,使用MPSR通道是Rust中进行并发的推荐方法(消息传递被提升为一种安全特性,比使用Arc指针和互斥体的直接共享更不容易出错)。虽然我们可以预期它会有一些开销,我们也可以相信Rust团队推荐它作为多线程的标准方法是有原因的-他们重视速度。在所有的可能性中,开销非常低,我怀疑在幕后你只是改变了所有权(因为在硬件级别上,所有线程都可以以多个进程所不能的方式访问同一内存)。
所以基本上,Rust使用智能指针进行多处理,传递消息时唯一需要改变的是指针的所有权,以及堆上的底层数据。
但是大:我发现了一个名为“bus”的机箱,它是一个基于MPSC代码的单生产者多消费者系统。它有一个已知的高CPU使用率问题(https://github.com/jonhoo/bus/issues/23)。我没有发现MPSC有类似的问题,但我确实发现了关于内存的投诉(https://users.rust-lang.org/t/mpsc-channels-high-memory-usage/78651/5)。虽然阅读了回复,我不认为这是你需要担心的问题。