美文网首页
情绪emo,不想做课题, 学学Rust吧

情绪emo,不想做课题, 学学Rust吧

作者: 球果假水晶蓝 | 来源:发表于2023-10-25 18:36 被阅读0次

rust 利用rayon ceate 实现多线程

例子1

use std::collections::HashMap;
use rayon::prelude::*;
use std::fs::File;
use std::io::{self, BufRead};

fn main() -> io::Result<()> {
    let filenames = vec!["file1.txt", "file2.txt", "file3.txt", "file4.txt"]; // 你的文件名列表
    let mut file_contents: HashMap<String, String> = HashMap::new();

    filenames.par_iter().for_each(|filename| {
        if let Ok(file) = File::open(filename) {
            let reader = io::BufReader::new(file);
            let lines: Vec<_> = reader
                .lines()
                .map(|line| line.unwrap_or_else(|e| e.to_string()))
                .collect();
            let content = lines.join("\n");

            file_contents.insert(filename.to_string(), content);
        }
    });

    // 现在你有一个包含文件名和文件内容的哈希表
    for (filename, content) in &file_contents {
        println!("File: {}\n{}", filename, content);
    }

    Ok(())
}


首先创建一个空的HashMap,其中文件名作为键,文件内容作为值。然后,我们使用par_iter().for_each()并行地读取文件并将内容插入哈希表中。最后,我们遍历哈希表以打印文件名和内容。
请注意,如果多个线程尝试同时插入哈希表,你需要确保在插入操作上进行适当的同步,以避免竞态条件。在上面的示例中,由于每个线程处理不同的文件,因此没有并发插入相同的键,因此不需要额外的同步。但如果你的需求更复杂,需要并发插入相同的键,你可能需要使用Mutex等同步机制来确保线程安全

例子2

对file_contents哈希表加锁,确保同一时间只有一个线程修改它。

use std::collections::HashMap;
use rayon::prelude::*;
use std::fs::File;
use std::io::{self, BufRead};
use std::sync::{Arc, Mutex};

fn main() -> io::Result<()> {
    let filenames = vec!["file1.txt", "file2.txt", "file3.txt", "file4.txt"]; // 你的文件名列表
    let file_contents: Arc<Mutex<HashMap<String, String>>> = Arc::new(Mutex::new(HashMap::new()));

    filenames.par_iter().for_each(|filename| {
        if let Ok(file) = File::open(filename) {
            let reader = io::BufReader::new(file);
            let lines: Vec<_> = reader
                .lines()
                .map(|line| line.unwrap_or_else(|e| e.to_string()))
                .collect();
            let content = lines.join("\n");

            // 使用 Mutex 来保护哈希表的插入操作
            let mut table = file_contents.lock().unwrap();
            table.insert(filename.to_string(), content);
        }
    });

    // 现在你有一个包含文件名和文件内容的哈希表,它是线程安全的
    let table = file_contents.lock().unwrap();
    for (filename, content) in table.iter() {
        println!("File: {}\n{}", filename, content);
    }

    Ok(())
}

例子3

rust 多线程读取超大文件

use std::fs::File;
use std::io::{self, BufRead, BufReader};
use rayon::prelude::*;

// Function to read a file
fn read_file(filename: &str) -> io::Result<BufReader<File>> {
    let file = File::open(filename)?;
    Ok(BufReader::new(file))
}
let target_word = "ERROR";

let reader = read_file("large_file.txt").expect("Could not read file");

let error_count: usize = reader
    .lines()
    .filter_map(Result::ok)
    .par_bridge()
    .filter(|line| {
        line.contains(target_word) // This is a stand in  for expensive line processing
    })
    .count();

println!("Number of error logs: {}", error_count);

相关文章

  • 失业第二天,焦虑

    原本以为会是轻轻松松的一个中场休息,没想到把自己整emo了。 emo就emo吧,焦虑就焦虑吧,不必去抑制自己的情绪...

  • Emo的时候,这几招你一定用得到!

    文章的开头,先解释一下什么是Emo吧! Emo(Emotional Hardcore)是一个网络新词汇,意思为情绪...

  • 90-36感激日记

    1、对照 如何从emo的情绪里面走出来 那么就要去从根源入手 比如 当你知道emo来的时候启动的自我保护意识 是不...

  • Rust简明学习手册 - Rust安装和基本概念

    前言 好久没学新语言了,最近打算学学Rust并记录一下Rust的要点,方便后期给自己参考。 快速安装 Macos ...

  • 不emo

    城镇化,中国这几十年的飞速发展,让新一代年轻人总想大干一场,上学时觉得几百万都是小钱,社会经验不丰富,再加上网络信...

  • emo是什么

    emo 全称 Emotional Hardcore,即情绪硬核化说唱。2021 年成为网络热词,通常说「我 emo...

  • 1477面对不可言说的恐惧

    这是菡萏萏的第1477篇 1559-1609用时10分钟字数419 终于从emo的情绪中走出来了,可以想想自己想做...

  • 2021-10-31

    之前有人羡慕我心如止水超级通透。 其实作为一个人,我也有自己的课题,该经历还是会经历,该emo还是会emo,只是在...

  • 生活,偶尔允许自己的emo

    在疫情之下的这个时期,全网都被emo刷屏。EMO,全称Emotional Hardcore,中文名称情绪硬核。em...

  • emo是什么意思?为什么不能好好说话?

    emo是什么意思? 我emo了,网络流行语,意思是我情绪上来了,一般都是些负面情绪 ,可以理解为“我颓废了”、“我...

网友评论

      本文标题:情绪emo,不想做课题, 学学Rust吧

      本文链接:https://www.haomeiwen.com/subject/nrneidtx.html