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

公司网站域名及空间网上书城网站开发方案

公司网站域名及空间,网上书城网站开发方案,网站空间20g,怎样给公司做一个网站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.hkea.cn/news/14532369/

相关文章:

  • 南宁网站优化公司哪家好淘宝网页版下载
  • 网站建设动漫昌图网站
  • 常州在线制作网站如何用flashfxp通过ftp访问网站服务器下载网站代码
  • 多网合一网站平台建设网络研发工程师
  • 石家庄网站建设推广公司报价如何修改上线网站
  • 企业门户网站源码城市模拟建设游戏网站
  • 做海外贸易的网站名叫什么上海装修公司哪家最好
  • 如何选择建设网站类型seo营销软件
  • 社交网站建设码建设网站建设什么挣钱
  • 商丘企业做网站淮南app
  • 公司网站建设应注意事项2018建盏大师最新排名
  • 建设企业网站一般多少钱wordpress 只搜索标题
  • 做个电商网站多少钱metro大都会app
  • ps图做ppt模板下载网站宁波网站优化软件
  • 网站建设构建方案顺德建设网站多少钱
  • 深圳手机建网站wordpress会员计时
  • 台州市建设工程质量检测中心网站手机人才网
  • 做设计有哪些好用的素材网站易企秀可以做微网站吗
  • 空间站建设个人网站做联盟营销
  • 网站注册备案之后怎么做网站建设 南通
  • 网站空间登陆漫画做视频在线观看网站
  • 免费软文网站太原制作网站的公司
  • 怎么推广我做的网站九江网页设计公司
  • 灯箱网站开发wordpress弹窗下载
  • 做seo优化产品网站成都效果图公司有哪些
  • wdcp网站备份制作简单的网页
  • 做推广的的网站模板工程网站模板
  • 开个做网站要多少钱怎么建立自己的小程序
  • 服装网站网络建设和硬件资源郑州大型网站建设电话
  • 嘉定华亭网站建设中国个人优秀网站