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

域名信息查询网站南京室内设计公司排名

域名信息查询网站,南京室内设计公司排名,商城WordPress,用ps做网站2021年上半年#xff0c;撸了个rust cli开发的框架#xff0c;基本上把交互模式#xff0c;子命令提示这些cli该有的常用功能做进去了。项目地址#xff1a;https://github.com/jiashiwen/interactcli-rs。 春节以前看到axum已经0.4.x了#xff0c;于是想看看能不能用rus…2021年上半年撸了个rust cli开发的框架基本上把交互模式子命令提示这些cli该有的常用功能做进去了。项目地址https://github.com/jiashiwen/interactcli-rs。 春节以前看到axum已经0.4.x了于是想看看能不能用rust做个服务端的框架。 春节后开始动手在做的过程中会碰到各种有趣的问题。于是记下来想和社区的小伙伴一起分享。社区里的小伙伴大部分是DBA和运维同学如果想进一步了解更底层的东西代码入手是个好路数。 我个人认为想看懂代码先要写好代码起码了解开发的基本路数和工程的一般组织模式。但好多同学的主要工作并不是专职开发所以也就没有机会下探研发技术。代码这个事儿光看书是不管用的。了解一门语言最好的方式是使用它。 那么问题来了非研发人员如何熟悉语言呢咏春拳里有句拳谚”无师无对手桩与镜中求“。解释两句就是在没有师兄弟练习的情况下对着镜子和木人桩练习。在这里我觉得所谓桩有两层含义一个是木人桩就是练习的工具一个是”站桩“传统武术训练基本功的方法。其实在实际的工作中DBA和运维同学会有很多场景需要编程比如做一些运维方面的统计工作分析问题时需要拿到某些数据。如果追求简单用Python的话可能对于其他语言就没有涉猎了。如果结合你运维数据库的原生开发语言假以时日慢慢就能看懂相关的底层逻辑了。我个人有个观点产品研发的原生语言是了解产品底层最好的入口。 后面如果在Rust的开发过程中有其他问题我本人会把问题结合实际也写到这个系列里也希望社区里对Rust感兴趣的小伙伴一起来”盘Rust“。 言归正传说说这次在玩儿Rust时遇到的问题吧。 在 Rust 开发过程中我们经常需要全局变量作为公共数据的存放位置。通常做法是利用 lazy_static/onecell 和 mux/rwlock 生成一个静态的 collection。 代码长这样 use std::collections::HashMap; use std::sync::RwLock;lazy_static::lazy_static! {static ref GLOBAL_MAP: RwLockHashMapString,String RwLock::new({let map HashMap::new();map}); } 基本的数据存取这样实现 use std::collections::HashMap; use std::sync::RwLock;lazy_static::lazy_static! {static ref GLOBAL_MAP: RwLockHashMapString,String RwLock::new({let map HashMap::new();map}); }fn main() {for i in 0..3 {insert_global_map(i.to_string(), i.to_string())}print_global_map();println!(finished!); }fn insert_global_map(k: String, v: String) {let mut gpw GLOBAL_MAP.write().unwrap();gpw.insert(k, v); }fn print_global_map() {let gpr GLOBAL_MAP.read().unwrap();for pair in gpr.iter() {println!({:?}, pair);} } insert_global_map函数用来向GLOBAL_MAP插入数据print_global_map()用来读取数据上面程序的运行结果如下 (0, 0) (1, 1) (2, 2) 下面我们来实现一个比较复杂一点儿的需求从 GLOBAL_MAP 里取一个数如果存在后面进行删除操作,直觉告诉我们代码似乎应该这样写 use std::collections::HashMap; use std::sync::RwLock;lazy_static::lazy_static! {static ref GLOBAL_MAP: RwLockHashMapString,String RwLock::new({let map HashMap::new();map}); }fn main() {for i in 0..3 {insert_global_map(i.to_string(), i.to_string())}print_global_map();get_and_remove(1.to_string());println!(finished!); }fn insert_global_map(k: String, v: String) {let mut gpw GLOBAL_MAP.write().unwrap();gpw.insert(k, v); }fn print_global_map() {let gpr GLOBAL_MAP.read().unwrap();for pair in gpr.iter() {println!({:?}, pair);} }fn get_and_remove(k: String) {println!(execute get_and_remove);let gpr GLOBAL_MAP.read().unwrap();let v gpr.get(*k.clone());let mut gpw GLOBAL_MAP.write().unwrap();gpw.remove(*k.clone()); } 上面这段代码输出长这样 (0, 0) (1, 1) (2, 2) execute get_and_remove 代码没有结束而是hang在了get_and_remove函数。 为啥会出现这样的情况呢这也许与生命周期有关。gpr和gpw 这两个返回值分别为 RwLockReadGuard 和 RwLockWriteGuard查看这两个 struct 发现确实可能引起死锁 must_not_suspend holding a RwLockWriteGuard across suspend \points can cause deadlocks, delays, \and cause Futures to not implement Send 问题找到了就可以着手解决办法了既然是与rust的生命周期有关那是不是可以把读和写分别放在两个不同的生命周期里呢于是对代码进行改写 use std::collections::HashMap; use std::sync::RwLock;lazy_static::lazy_static! {static ref GLOBAL_MAP: RwLockHashMapString,String RwLock::new({let map HashMap::new();map}); }fn main() {for i in 0..3 {insert_global_map(i.to_string(), i.to_string())}print_global_map();get_and_remove(1);println!(finished!); }fn insert_global_map(k: String, v: String) {let mut gpw GLOBAL_MAP.write().unwrap();gpw.insert(k, v); }fn print_global_map() {let gpr GLOBAL_MAP.read().unwrap();for pair in gpr.iter() {println!({:?}, pair);} }fn get_and_remove_deadlock(k: String) {println!(execute get_and_remove);let gpr GLOBAL_MAP.read().unwrap();let _v gpr.get(*k.clone());let mut gpw GLOBAL_MAP.write().unwrap();gpw.remove(*k.clone()); }fn get_and_remove(k: i32) {let v {let gpr GLOBAL_MAP.read().unwrap();let v gpr.get(*k.to_string().clone());match v {None Err(anyhow!()),Some(pair) Ok(pair.to_string().clone()),}};let vstr v.unwrap();println!(get value is {:?}, vstr.clone());let mut gpw GLOBAL_MAP.write().unwrap();gpw.remove(*vstr); } 正确输出 (1, 1) (0, 0) (2, 2) get value is 1 (0, 0) (2, 2) finished! Rust的生命周期是个很有意思的概念从认识到理解确实有个过程。 源码地址 作者京东科技 贾世闻 来源京东云开发者社区 转载请注明来源
http://www.hkea.cn/news/14390406/

相关文章:

  • 网站建设论文要求免费建网站最新视频教程
  • 动态倒计时网站模板网站建设代理推广徽信xiala5效果好
  • 网站制作前的图片路径崇礼做网站的公司
  • 禁忌网站网站开发 团队构成
  • 网站 如何 备案网站推广引流最快方法
  • 网站建设孩子半夜发烧怎么办电子商务网站建设期末题库
  • 酒店网站搜索引擎优化方案宣城网站seo
  • 深圳建网站 (报价)专业网站建设定制公司
  • 磁力网站怎么做的源码网站推广技巧有哪些?
  • 太原做网站的鸣蝉公司大学网页设计作业
  • 农村建设网站好的网站建设网
  • 新市区做网站什么静态网站容易做
  • 大学城网站开发公司电话南宁横县网站建设推广
  • 网站建设毕业设计提问天津做网站的费用
  • 网站权重提升wordpress进不去设置会乱码
  • 网站开发调研方案网站模板 wordpress
  • 淘宝优惠券微网站开发校园网站建设年度总结
  • 网站域名好了下一步问题反馈的网站怎么做
  • 云南能投基础设施投资开发建设有限公司网站代理注册公司注意事项
  • 百度推广送企业网站吗内部网站建设的步骤过程
  • 网站建设 英文怎么说做的一个网站多少钱
  • 办个人网站租空间重庆市建设工程信息网综合网
  • 网站建设教程视频网络推广竞价
  • 找人做logo网站网站备案情况查询
  • 群晖可不可以做网站用wordpress 培训小程序
  • 个人域名可以做企业网站吗石景山郑州阳网站建设
  • 网站建设费算不算固定资产安徽建设干部学校网站
  • 企业网站案例公司游戏下载网站 wordpress
  • 个人网站 备案东营考试信息网官网
  • 沽源网站建设佛山网站制作哪个好薇