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

网站建设与管理课程视频长沙大型网站建设

网站建设与管理课程视频,长沙大型网站建设,海外房地产网站建设,wordpress伪静态404 nginxRust实现基于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.huolong8.cn/news/247607/

相关文章:

  • 网站制作哪家好清远seo
  • 网站建设外文版要求上海网站改版服务
  • 五屏网站建设哪家有彩页设计培训
  • 商城网站主机网站及其建设的心得体会
  • 杭州亚运村建设指挥部网站南宁建站服务
  • 移动端网站模板赣州市建设工程造价管理网站
  • 思途智旅游网站开发浙江微信网站建设
  • 个人网站建设简历十大社交电商平台排名
  • 快速开租建站怎么找人做淘宝网站
  • 禹城做网站食品网站建设需求分析
  • 安庆 网站建设建筑人才网证书查询
  • 成都建设网官方网站怎样做安居客网站
  • 中国代理网官方网站四川建设公司网站
  • 有没有免费做编辑网站管理系统h5开发游戏
  • 有了自己的网站怎样做后台百度网盟推广体验中心
  • 滨海新区网站建设专门做纪录片的网站
  • 佛山网站建设公司怎么样团购网站建设怎么样
  • 小说写作网站邢台谷歌seo
  • 网站建设 h5 小程序网站功能详细设计
  • 内部网站制作泉州网站制作企业
  • 西部数码个人网站电子网站模板
  • 网站后台编辑教程国外html响应式网站
  • 大连新图闻网站设计网站开发有什么职位
  • 百度营稍福州seo经理招聘
  • 网站创建桌面快捷方式空间设计专业
  • 长沙做网站工作室上海市做网站
  • 怎么修改网站标题关键词描述房地产类的网站建设
  • .net 网站关键字网页和网站有什么区别
  • 小说网站建设的支柱常州网站设计公司
  • 唐山滦县网站建设东莞建设银行网点查询