< 返回版块

WorldLink 发表于 2020-12-10 20:50

Tags:rust,并发,async_std,tokio,异步

感觉也不像是数据竞争 代码如下:

use async_std::channel::Receiver;
use async_std::fs::File;
use async_std::prelude::*;
use std::path::PathBuf;

pub struct Output {
    rec: Receiver<String>,
    outfile: Option<PathBuf>,
}

impl Output {
    pub async fn new(rec: Receiver<String>, outfile: Option<PathBuf>) -> Output {
        Output {
            rec,
            outfile,
        }
    }

    pub async fn run(&self) {
        let output: Option<File>;
        match &self.outfile {
            None => {
                output = None
            }
            Some(file) => {
                output = Some(File::create(file).await.unwrap());
            }
        };

        'a:
        loop {
            match self.rec.recv().await {
                Ok(r) => {
                    match &self.outfile {
                        None => {
                            println!("{}", r);
                        }
                        Some(..) => {
                            println!("{}", r);
                            let r = format!("{} \n", r);
                            output.as_ref().unwrap().write(r.as_bytes()).await.unwrap();
                        }
                    }
                }
                Err(_) => {
                    break 'a;
                }
            }
        }
    }
}

数据写入channel里面 轮询channel写入到文件当中

log输出没有问题 没有乱序


127.0.0.1:139
127.0.0.1:445
127.0.0.1:631
127.0.0.1:3306
127.0.0.1:6379
127.0.0.1:5432
127.0.0.1:6942
127.0.0.1:27017
127.0.0.1:63342

但是输出到文件 乱了

127.0.0.1:139 
127.0.0.1:445 
127.0.0.1:631 
127.0.0.1:3306 127.0.0.1:6379
127.0.0.1:5432127.0.0.1:6942
127.0.0.1:2701127.0.0.1:63342

我把 let output: Option; 加锁 let output: Option<Mutex>; 还是乱序?

具体:https://github.com/dollarkillerx/blackwater/blob/main/src/output.rs

评论区

写评论
作者 WorldLink 2020-12-10 22:48

谢谢大佬

--
👇
whfuyn: https://docs.rs/async-std/1.8.0/async_std/io/trait.Write.html#method.write

write的语义不是全部写进去,而是写一些,写了多少会返回。

write_all吧。

whfuyn 2020-12-10 21:35

https://docs.rs/async-std/1.8.0/async_std/io/trait.Write.html#method.write

write的语义不是全部写进去,而是写一些,写了多少会返回。

write_all吧。

作者 WorldLink 2020-12-10 21:16

修改成同步的std::fs::File就没有乱序了???

1 共 3 条评论, 1 页