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

杭州做网站哪家好免费行情软件网站下载大全

杭州做网站哪家好,免费行情软件网站下载大全,真正免费的网站建站平台排名,做网站的收入来源在实际开发过程中,我们可能会遇到并发写文件的场景,如果处理不当很可能出现文件内容乱序问题。下面我们通过一个示例程序描述这一过程并给出解决该问题的方法。 use std::{fs::{self, File, OpenOptions},io::{Write},sync::Arc,time::{SystemTime, UNI…

在实际开发过程中,我们可能会遇到并发写文件的场景,如果处理不当很可能出现文件内容乱序问题。下面我们通过一个示例程序描述这一过程并给出解决该问题的方法。

use std::{fs::{self, File, OpenOptions},io::{Write},sync::Arc,time::{SystemTime, UNIX_EPOCH},
};
use tokio::task::JoinSet;fn main() {println!("parallel write file!");let max_tasks = 200;let _ = fs::remove_file("/tmp/parallel");let file_ref = OpenOptions::new().create(true).write(true).append(true).open("/tmp/parallel").unwrap();let mut set: JoinSet<()> = JoinSet::new();let rt = tokio::runtime::Runtime::new().unwrap();rt.block_on(async {loop {while set.len() >= max_tasks {set.join_next().await;}未做写互斥函数let mut file_ref = OpenOptions::new().create(true).write(true).append(true).open("/tmp/parallel").unwrap();set.spawn(async move { write_line(&mut file_ref) });}});
}fn write_line(file: &mut File) {for i in 0..1000 {let now = SystemTime::now().duration_since(UNIX_EPOCH).unwrap();let mut content = now.as_secs().to_string();content.push_str("_");content.push_str(&i.to_string());file.write_all(content.as_bytes()).unwrap();file.write_all("\n".as_bytes()).unwrap();file.write_all("\n".as_bytes()).unwrap();}
}

代码不复杂,tokio 实现一个并发runtime,写文件函数是直接写时间戳,为了方便展示乱序所以写入两次换行。

输出的文本大概长这样

1691287258_9791691287258_7931691287258_3011691287258_7431691287258_6031691287258_8941691287258_471691287258_895
1691287258_5531691287258_950
1691287258_9801691287258_48
1691287258_3021691287258_896
1691287258_7441691287258_6041691287258_554

很明显,写入并未达到预期,间隔并不平均,函数内部的执行步骤是乱序的。

我们把上面的程序改造一下

use std::{fs::{self, File, OpenOptions},io::Write,sync::Arc,time::{SystemTime, UNIX_EPOCH},
};
use tokio::sync::Mutex;
use tokio::task::JoinSet;fn main() {println!("parallel write file!");let max_tasks = 200;let _ = fs::remove_file("/tmp/parallel");let file_ref = OpenOptions::new().create(true).write(true).append(true).open("/tmp/parallel").unwrap();let f = Arc::new(Mutex::new(file_ref));let mut set: JoinSet<()> = JoinSet::new();let rt = tokio::runtime::Runtime::new().unwrap();rt.block_on(async {loop {while set.len() >= max_tasks {set.join_next().await;}let mut file = Arc::clone(&f);set.spawn(async move { write_line_mutex(&mut file).await });}});
}async fn write_line_mutex(mutex_file: &Arc<Mutex<File>>) {for i in 0..1000 {let mut f = mutex_file.lock().await;let now = SystemTime::now().duration_since(UNIX_EPOCH).unwrap();let mut content = now.as_secs().to_string();content.push_str("_");content.push_str(&i.to_string());f.write_all(content.as_bytes()).unwrap();f.write_all("\n".as_bytes()).unwrap();f.write_all("\n".as_bytes()).unwrap();}
}

这次我们用到了tokio::sync::Mutex,write_line_mutex函数在每次执行写任务以前先获取文件互斥锁。

看看这次的文件内容

1691288040_3741691288040_3741691288040_3741691288040_3751691288040_3741691288040_3741691288040_3741691288040_3741691288040_3741691288040_3741691288040_3741691288040_3741691288040_3741691288040_3741691288040_3751691288040_3751691288040_3741691288040_3751691288040_3751691288040_3751691288040_3751691288040_3751691288040_3751691288040_3751691288040_3751691288040_3751691288040_375

写入的格式正确,保证每次函数写函数完整执行。

关于文件写互斥这点事儿,今儿就聊到这。

完整源码

作者:京东科技 贾世闻

来源:京东云开发者社区

http://www.dt0577.cn/news/26883.html

相关文章:

  • 怎么搭建自己的网站卖货上海b2b网络推广外包
  • 重庆 机械有限公司 江北网站建设semi
  • 北京通州个人网站建设天津百度seo代理
  • 做外贸用哪些网站体球网足球世界杯
  • 淄博网站排名优化公司百度知道官网登录入口
  • 网络游戏推广公司重庆seo是什么
  • 关于内网站建设的请示软文案例短篇
  • 购物网站的页面设计化学sem是什么意思
  • 即时设计365优化大师软件下载
  • 深圳网站设计公司电nba西部最新排名
  • 建设网站方法有哪些拉新平台哪个好佣金高
  • 电商类网站建设价格百度推广优化怎么做
  • 厦门汽车充电站建设报备网站推广教程
  • 广州最新新闻发大水seo关键词排名优化价格
  • 椒江街道招聘建设网站网络营销常用的方法有哪些
  • 如何选择深圳网站建设深圳百度推广
  • 邢台移动网站建设seo竞价培训
  • 网站构建技术百度贴吧网页版
  • 衡水建设网站首页百度关键词优化多久上首页
  • php 手机网站 模板百度云搜索引擎入口网盘搜索神器
  • wordpress博客页面seo网站关键词快速排名
  • 北京做网站的人百度网站优化培训
  • 织梦做信息类网站seo外包公司多吗
  • 云服务器可以做两个网站发布外链的步骤
  • 什么网站可以做软件有哪些东西吗如何营销推广自己的产品
  • 精通网站建设工资多少seo和sem的区别与联系
  • 2万元建设网站贵吗电商大数据查询平台
  • 天津做网站都找津坤科技重庆网站制作
  • 邢台网站推广多少钱东莞seo建站优化哪里好
  • 长沙做网站建设网络营销方法和手段