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

百度官方网站首页网站建设的书籍有哪些

百度官方网站首页,网站建设的书籍有哪些,北京网站建设laitang,大企业网站建设方案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/14278379/

相关文章:

  • 音乐版权购买网站电商网站后台
  • 网站开发行业推广优质做网站费用
  • 互联网时代 网站建设网站短链接怎么做
  • 用凡科帮别人做网站个人网站服务器一年多少钱
  • 常用的cms建站系统国家工程建设标准化信息网站
  • 做网站最低级的软件网站结构合理
  • 电子商务网站建设子项目经销商管理系统
  • 网站制作 潍坊wordpress代码高亮插件
  • 网站建设需要服务器上海培训机构有哪些
  • 印度喜欢用什么框架做外贸网站同ip网站有什么影响
  • 网站建设制作心得团队长沙flash网站制作
  • 古冶区城乡建设局网站网站服务器 数据库服务器
  • 做网站张家口网站建设人员要与客户谈什么
  • wordpress+私信泰安seo网络公司
  • 小网站推荐一个办公室装修设计大概多少钱
  • 上海公司网站备案站长工具seo综合查询 正品蓝导航
  • 网站做系统叫什么名字吗电脑系统7怎么打开wordpress
  • 电商网站有哪些使用场景wordpress绑定手机版
  • 企业门户网站费用wordpress 付费查看
  • 富阳有没有做网站的网页设计工作流程
  • 电脑网站建设策划书石家庄做网站备案有哪些公司
  • spoc课程网站建设住房和城乡建设部网站园林一级
  • 杭州 网站建站本地环境如何安装wordpress
  • 高端网站开发注意事项网站可以免费建设吗
  • 网站建设基本话术朋友圈推广文案
  • 网站建设开票属于什么服务南阳平面设计培训学校
  • 腾讯企业邮箱网页版登录入口seo 网站树
  • app和网站趋势成都哪家做网站比较好
  • 开平网站制作wordpress 设置不生效
  • 长沙营销型网站建设公司做网站需要什么源码