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

建设网站 织梦百度seo关键词排名查询工具

建设网站 织梦,百度seo关键词排名查询工具,网站开发微信端,公司核名查询官网在实际开发过程中,我们可能会遇到并发写文件的场景,如果处理不当很可能出现文件内容乱序问题。下面我们通过一个示例程序描述这一过程并给出解决该问题的方法。 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.yayakq.cn/news/318334/

相关文章:

  • 做app需要先做网站吗软件项目管理案例分析
  • 网站设计制作策划书中小型企业网搭建
  • 永久免费erp昆明做网站优化公司
  • 上海虹桥站河南第二建设集团网站视频
  • 一个做微信文章的网站关键词站长工具
  • 网站备案被注销 2016如何建设电影网站
  • 中山网站建设服务网站工信部不备案吗
  • 调试网站解析域名影响标杆建设网站
  • 找高权重的网站做外链手机 网站 系统
  • 长沙网站设计多少钱一个月亚马逊云服务器收费标准
  • 昌平网站开发多少钱织梦门户网站
  • 网站建设项目实施方案深圳 手机网站建设
  • 网站开发流程记住吧熟悉网页设计人机交互实验报告
  • 贵阳做网站英文网站 建站
  • 网站常见问题泉州免费建站模板
  • 门户网站等保二级建设方案江门建设建筑网站
  • 浏览网站 需要我安装wordpresswordpress08影院源码
  • 使用wordpress搭建网站企业邮箱怎么申请域名
  • 梧州网站推广深圳品牌做网站
  • 做景观要用的植物网站做网站赚钱吗 怎么赚钱
  • 威海网站建设哪一家网站运维主要做些什么工作
  • 潍坊网站空间六盘水市住房和城乡建设局网站
  • 建站网站模板江西企业网站建设
  • 陕西建设网网站集群wordpress wp_query 排序
  • 个体工商户能做网站吗网页制作教程零基础合集
  • 高大上的企业网站网站开发明细
  • dedecms产品展示织梦模板(营销型网站)哪里有做网站服务商
  • 手机网站开发算什么费用茗匠智能门店管理系统
  • 聚成网络网站建设一篇网站设计小结
  • 淄博网站建设招聘wordpress运行导入器