在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何利用Mutex解決并發(fā)寫文件亂序的問題?

jf_wN0SrCdH ? 來源:京東云開發(fā)者 ? 2023-08-12 09:54 ? 次閱讀

在實際開發(fā)過程中,我們可能會遇到并發(fā)寫文件的場景,如果處理不當(dāng)很可能出現(xiàn)文件內(nèi)容亂序問題。下面我們通過一個示例程序描述這一過程并給出解決該問題的方法。

use std::{
    fs::{self, File, OpenOptions},
    io::{Write},
    sync::Arc,
    time::{SystemTime, UNIX_EPOCH},
};
use tokio::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::new().unwrap();
    rt.block_on(async {
        loop {
            while set.len() >= max_tasks {
                set.join_next().await;
            }
            未做寫互斥函數(shù)
            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("
".as_bytes()).unwrap();
        file.write_all("
".as_bytes()).unwrap();
    }
}

代碼不復(fù)雜,tokio 實現(xiàn)一個并發(fā)runtime,寫文件函數(shù)是直接寫時間戳,為了方便展示亂序所以寫入兩次換行。

輸出的文本大概長這樣:


1691287258_979










1691287258_7931691287258_301


1691287258_7431691287258_603


1691287258_8941691287258_47












1691287258_895
1691287258_553


1691287258_950
1691287258_980




1691287258_48
1691287258_302


1691287258_896
1691287258_744








1691287258_6041691287258_554

很明顯,寫入并未達(dá)到預(yù)期,間隔并不平均,函數(shù)內(nèi)部的執(zhí)行步驟是亂序的。

我們把上面的程序改造一下:


use std::{
    fs::{self, File, OpenOptions},
    io::Write,
    sync::Arc,
    time::{SystemTime, UNIX_EPOCH},
};
use tokio::Mutex;
use tokio::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::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>) {
    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("
".as_bytes()).unwrap();
        f.write_all("
".as_bytes()).unwrap();
    }
}

這次我們用到了tokio::Mutex,write_line_mutex函數(shù)在每次執(zhí)行寫任務(wù)以前先獲取文件互斥鎖。

看看這次的文件內(nèi)容:


1691288040_374


1691288040_374


1691288040_374


1691288040_375


1691288040_374


1691288040_374


1691288040_374


1691288040_374


1691288040_374


1691288040_374


1691288040_374


1691288040_374


1691288040_374


1691288040_374


1691288040_375


1691288040_375


1691288040_374


1691288040_375


1691288040_375


1691288040_375


1691288040_375


1691288040_375


1691288040_375


1691288040_375


1691288040_375


1691288040_375


1691288040_375

寫入的格式正確,保證每次函數(shù)寫函數(shù)完整執(zhí)行。

關(guān)于文件寫互斥這點事兒,今兒就聊到這。






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Unix系統(tǒng)
    +關(guān)注

    關(guān)注

    0

    文章

    15

    瀏覽量

    9795
  • ARC
    ARC
    +關(guān)注

    關(guān)注

    0

    文章

    43

    瀏覽量

    16736
  • rust語言
    +關(guān)注

    關(guān)注

    0

    文章

    57

    瀏覽量

    3122

原文標(biāo)題:文盤Rust -- Mutex解決并發(fā)寫文件亂序問題

文章出處:【微信號:Rust語言中文社區(qū),微信公眾號:Rust語言中文社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦
    熱點推薦

    詳解linux內(nèi)核中的mutex同步機制

    在linux內(nèi)核中,互斥量(mutex,即mutual exclusion)是一種保證串行化的睡眠鎖機制。和spinlock的語義類似,都是允許一個執(zhí)行線索進(jìn)入臨界區(qū),不同的是當(dāng)無法獲得鎖的時候
    的頭像 發(fā)表于 05-13 08:56 ?7260次閱讀
    詳解linux內(nèi)核中的<b class='flag-5'>mutex</b>同步機制

    Linux內(nèi)核同步機制mutex詳解

    在linux內(nèi)核中,互斥量mutex是一種保證CPU串行運行的睡眠鎖機制。和spinlock類似,都是同一個時刻只有一個線程進(jìn)入臨界資源,不同的是,當(dāng)無法獲取鎖的時候,spinlock原地自旋,而mutex則是選擇掛起當(dāng)前線程,進(jìn)入阻塞狀態(tài)。所以,
    發(fā)表于 06-26 16:05 ?1479次閱讀

    Raw-os mutex

    1mutex 支持FIFO 和PRIO 的任務(wù)阻塞策略,如果是FIFO 的話阻塞隊列的順序是按照先來后到的次序去排列阻塞任務(wù),PRIO 策略的話是按照優(yōu)先級的排序。具體的設(shè)置可以直接設(shè)置這個結(jié)構(gòu)體中
    發(fā)表于 02-27 14:03

    關(guān)于mutex

    mutex的出現(xiàn)是為了解決優(yōu)先級反轉(zhuǎn)的問題,由于優(yōu)先級反轉(zhuǎn)對實時性影響太大,所以mutex 的穩(wěn)定性直接影響了實時性。縱觀目前多種實時操作系統(tǒng)mutex 的設(shè)計原理是多多少少有一點問題的,raw
    發(fā)表于 02-27 14:34

    labview寫入access數(shù)據(jù)庫亂序問題

    用database insert 插入數(shù)據(jù),移位寄存器當(dāng)作順序編號,發(fā)現(xiàn)不管循環(huán)框頻率設(shè)多少,到編號713這里必定會跳到737,然后中間這段會在1035后出現(xiàn),其他地方也有類似的亂序,多次寫入亂序
    發(fā)表于 08-09 10:23

    互斥量Mutex相關(guān)資料推薦

    這里目錄標(biāo)題概述API二級目錄三級目錄概述APItx_mutex_createtx_mutex_deletetx_mutex_gettx_mutex_put二級目錄三級目錄
    發(fā)表于 02-22 07:40

    適用于IPTV大并發(fā)應(yīng)用的文件格式

    分析交互式網(wǎng)絡(luò)電視(IPTV)大并發(fā)應(yīng)用的特性,提出一種適用于IPTV大并發(fā)應(yīng)用的服務(wù)器內(nèi)部文件格式cl4文件格式。該文件格式采用了符合IP
    發(fā)表于 04-15 10:02 ?17次下載

    什么是CPU分枝/亂序執(zhí)行?

    什么是分枝/亂序執(zhí)行?   分枝(branch)是指程序運行時需要改變的節(jié)點。分枝有無條件分枝和有條件分枝,其中無條件分枝只
    發(fā)表于 02-04 10:49 ?956次閱讀

    如何采用DATA進(jìn)行Flash的在線燒

    自加載后DSP能夠正常運行,關(guān)鍵是Flash中原程序代碼的正確燒。CCS編譯生成的.out格式文件不能直接用于Flash燒,在TI公司給出的技術(shù)文檔閉中,首先將.out文件
    的頭像 發(fā)表于 02-06 08:51 ?3929次閱讀
    如何采用DATA進(jìn)行Flash的在線燒<b class='flag-5'>寫</b>

    Linux多線程同步互斥量Mutex詳解

    pthread_mutex_destroy(pthread_mutex_t *mutex);頭文件:返回值: 成功則返回0, 出錯則返回錯誤編號.說明: 如果使用默認(rèn)的屬性初始化互斥
    發(fā)表于 04-02 14:45 ?375次閱讀

    ThreadX(七)------互斥量Mutex

    這里目錄標(biāo)題概述API二級目錄三級目錄概述APItx_mutex_createtx_mutex_deletetx_mutex_gettx_mutex_put二級目錄三級目錄
    發(fā)表于 12-28 19:29 ?8次下載
    ThreadX(七)------互斥量<b class='flag-5'>Mutex</b>

    如何用Actix去一個類似于Facemash的小項目呢

    同時,和 MongoDB 不同的是,這里需要使用 Mutex 進(jìn)行封裝,因為極有可能多個出現(xiàn)多個線程并發(fā)獲取Id;
    的頭像 發(fā)表于 10-17 09:47 ?1072次閱讀
    如何用Actix去<b class='flag-5'>寫</b>一個類似于Facemash的小項目呢

    編譯器的亂序策略

    這篇文章的目的,是想明確下cpu指令亂序這件事。只要是熟悉計算機底層系統(tǒng)的同學(xué)就會知道,程序里面的每行代碼的執(zhí)行順序,有可能會被編譯器和cpu根據(jù)某種策略,給打亂掉,目的是為了性能的提升,讓指令的執(zhí)行能夠盡可能的并行起來。
    的頭像 發(fā)表于 05-19 14:46 ?931次閱讀
    編譯器的<b class='flag-5'>亂序</b>策略

    亂序文件如何重新命名編號

    如下圖所示,在本地文件夾中有這樣一堆視頻文件,在這種情況下并不是亂序的。 但是將其上傳到網(wǎng)盤中后,就會經(jīng)常變成亂序。即它們會按照1、10、11、2、20這樣排序,并不方便我們按順序去依
    的頭像 發(fā)表于 10-21 10:50 ?829次閱讀
    <b class='flag-5'>亂序文件</b>如何重新命名編號

    MQ消息亂序問題解析與實戰(zhàn)解決方案

    詳細(xì)探討MQ消息亂序問題的根源,并提供一系列在實際應(yīng)用中可行的解決方案。 2. MQ消息亂序問題分析 常見的MQ消息亂序問題的根源主要可以歸結(jié)為以下幾點: 2.1 相同topic內(nèi)的消息亂序
    的頭像 發(fā)表于 12-06 09:46 ?580次閱讀
    主站蜘蛛池模板: 中文天堂在线观看 | 人人爱人人艹 | 亚洲电影二区 | h视频在线观看网站 | 午夜一区二区三区 | 天堂在线www天堂中文在线 | 四虎永久免费网站免费观看 | 久久久久久久久久免观看 | 国产三级跑 | 亚洲一区二区免费看 | 男女视频在线观看免费 | 国产女主播精品大秀系列在线 | 国产亚洲精品在天天在线麻豆 | 韩日中文字幕 | 91视频精品| 久久精品国产精品亚洲毛片 | 国产小视频在线免费 | 男女交黄| 美女被羞羞产奶视频网站 | 久久久网站亚洲第一 | 69xxxx女人| 美女毛片在线观看 | 欧美特黄一区二区三区 | 免费公开视频人人人人人人人 | 日韩黄色网址 | 资源视频在线观看 | 日本特黄特色大片免费播放视频 | 男女无遮挡一进一出性视频 | 一级片黄色免费 | 手机看片1024免费视频 | 性色欧美xo影院 | 草草影院私人免费入口 | 成人精品视频在线观看播放 | 日韩亚 | 久久狠狠第一麻豆婷婷天天 | 你懂的在线视频播放 | 人色网 | 天天干天天玩 | 日本视频h | 欧美高清另类 | 丁香激情综合网 |