当前位置: 首页 > news >正文

网站 创意 方案临沂定制网站建设公司

网站 创意 方案,临沂定制网站建设公司,qq号码免费申请,wordpress站点用户注册Rust实现基于Tokio的限制内存占用的channel 简介 本文介绍如何基于tokio的channel实现一个限制内存占用的channel。 Tokio提供了多种协程间同步的接口#xff0c;用于在不同的协程中同步数据。 常用的channel有两种:bounded和unbounded#xff0c;其中ubbounded的channel可…Rust实现基于Tokio的限制内存占用的channel 简介 本文介绍如何基于tokio的channel实现一个限制内存占用的channel。 Tokio提供了多种协程间同步的接口用于在不同的协程中同步数据。 常用的channel有两种:bounded和unbounded其中ubbounded的channel可以无限的发送数据,而bounded的channel则有限的发送数据。两种channel都没有对自身的内存占用做出限制。 异步网络编程中常用一个channel连接两个task其中业务task与业务交互将要发送的数据发送到channel而网络task与操作系统交互从channel中接收数据并写入socket。单有时候带宽有限或者对端接收速率过慢时而网络task从channel中接收的速度小于业务task向channel中发送的速度时会造成大量的数据阻塞在channel中如果不对channel的占用内存做限制则会造成内存占用过多甚至进程被OOM。 实现 获取数据大小 要想限制channel总的内存占用必须要直到每个数据的大小。比较常见的作法是所有需要发送到channel的内容都必须实现一个Trait此Trait中定义了一个get_size方法,用于获取数据的大小。 pub trait GetSize {/// get total sizefn get_size(self) - usize; }要发送的内容必须实现GetSize的Trait,并实现get_size方法。注意get_size方法获取到的大小需包括栈空间和堆空间例如 struct MyData {data: Vecu8,}impl GetSize for MyData {fn get_size(self) - usize {return std::mem::size_of::MyData() self.data.len();//stack size heap size}}创建SizedSender和SizedReceiver SizedSender和SizedReceiver都可以基于tokio的UnboundedSender和UnboundedReceiver实现。在tokio的基础上需要共享一个条件变量用于在sender和receiver之间同步当前是否还有可用空间。 pub struct SizedSenderT: GetSize {inner: mpsc::UnboundedSenderT,size_semaphore: Arc(Semaphore, usize), } pub struct SizedReceiverT: GetSize {inner: mpsc::UnboundedReceiverT,size_semaphore: Arc(Semaphore, usize), }/// Limit space usage but not limit the number of messages, bytes_size must bigger than 0. pub fn sized_channelT: GetSize(bytes_size: usize) - (SizedSenderT, SizedReceiverT) {let (tx, rx) mpsc::unbounded_channel::T();let semaphore Arc::new((Semaphore::new(bytes_size), bytes_size));(SizedSender::new(tx, semaphore.clone()),SizedReceiver::new(rx, semaphore),) } SizedSender实现 发送端发送时需要调用get_size方法获取数据的大小,然后调用Semaphore::available_permits方法获取可用空间,如果可用空间大于数据大小,则发送成功,否则发送失败。 implT: GetSize SizedSenderT {pub fn new(inner: mpsc::UnboundedSenderT, size_semaphore: Arc(Semaphore, usize)) - Self {Self {inner,size_semaphore,}}fn do_send(self,message: T,permits: OptionSemaphorePermit_,) - Result(), SendErrorT {match self.inner.send(message) {Ok(r) {if let Some(permits) permits {permits.forget();}Ok(r)}Err(e) {log::debug!(send value error!);Err(e)}}}pub async fn send(self, message: T) - Result(), SendErrorT {let message_size message.get_size();if message_size self.size_semaphore.1 {return Err(SendError(message));}let size match u32::try_from(message_size) {Ok(size) size,Err(_) {return Err(SendError(message));}};if self.size_semaphore.0.available_permits() size as usize {// The buffer is about to be depleted, sending may be blocked.}let permits match self.size_semaphore.0.acquire_many(size).await {Ok(perimits) Some(perimits),Err(_) {return Err(SendError(message));}};self.do_send(message, permits)}}SizedReceiver的实现 接收端接收时需要调用get_size方法获取数据的大小,然后将相应大小的permits还给信号量即可。 implT: GetSize SizedReceiverT { pub fn new(inner: mpsc::UnboundedReceiverT, size_semaphore: Arc(Semaphore, usize)) - Self {Self {inner,size_semaphore,} }pub async fn recv(mut self) - OptionT {self.inner.recv().await.map(|r| {let message_size r.get_size();self.size_semaphore.0.add_permits(message_size);r}) } } 其他 在上述实现的基础上还可以实现更多方法比如try_send、try_recv等。
http://www.zqtcl.cn/news/123033/

相关文章:

  • 哪里有网站建设多少钱网站建设哪家服务态度好
  • 白云区网站开发公司备案不关闭网站的方法
  • 男的做那个视频网站家用电脑可以做网站服务器
  • 网站建设的行业客户烟台市未成年思想道德建设网站
  • 设计个网站要多少钱鼓楼网站开发
  • 东莞外贸网站搭建制作北京app开发制作
  • 优化网站公司外包微信商城怎么开店
  • 网站设计的导航栏怎么做东莞seo网络优化
  • wordpress直接上传视频网站吗做网站软件
  • 电脑维修网站模板下载来个网站吧好人一生平安2021
  • 做公益选哪个网站好网站建设方案多少钱
  • 丰台做网站的公司vs2015 手机网站开发
  • 宝思哲手表网站qq官网登录入口网页版
  • 二手书网站开发设计太原建设网站的公司
  • 江门网站seo推广qq代挂网站建设
  • 合肥制作网站企业做文字logo的网站
  • php 网站提速有没有帮人做简历的网站
  • 九江建网站报价比特币网站做任务
  • 电子商务网站开发目的和意义网站建设湖南岚鸿建设
  • 网站改版提交给百度个人定做衣服店
  • 网站接广告网站用途说明
  • 中兴豫建设管理有限公司网站中小企业网站建设济南兴田德润o厉害吗
  • 枣庄有做网站的吗网站 关键词 多少个
  • 广州10大网站服务品牌做网站买了域名之后
  • 北京网站备案电商网站建设考试
  • 微信官网网站虚拟主机网站被挂马
  • 怎么看网站是不是h5做的建设网站的目的和功能
  • 购销网站建设视频百度云中国数据网
  • 网站运营队伍与渠道建设成都开发网站建设
  • 手机网站图片宽度做儿童交互网站