文章

顯示包含「Rust」標籤的文章

[工作經驗] Rust tokio 不想 await task 但卻想提早知道有沒有 error

圖片
假設我們想要平行地跑兩個 tasks A 和 B,我們用 async task A 來跑主要的程式,用 task B 來監控正在跑的程式。Task A 跑完了我們就不管 task B 可以直接結束程式了,所以 task B 我們並不想用 await 去等待他。 這時候就有一個小陷阱正在等著我們:如果 task B 提早發生錯誤,我們可能就會忘記去處理他。 壞程式 最近就不小心寫出像下面這樣的 code: use std::error::Error; #[tokio::main] async fn main() -> Result<(), Box<dyn Error>> { let task_a_handle = tokio::spawn(async move { tokio::time::sleep(tokio::time::Duration::from_secs(5)).await; if true { anyhow::bail!("Something went wrong in task A"); } else { Ok(()) } }); tokio::task::spawn_blocking(move || { std::thread::sleep(std::time::Duration::from_secs(1)); if true { anyhow::bail!("Something went wrong in task B"); } else { Ok(()) } }); match task_a_handle.await? { Ok(_) => println!("Finished"), Err(e) => panic!("Something wrong: {e}"), } Ok(()) } 我們可以看...

[技巧] 同硬碟不同OS動態切換 Rustup/Cargo 路徑

問題 Linux 上不管切換到 x86 還是 Arm 工作上都是用同一個 mount 到的路徑,所以 $HOME 其實資料都一樣。 但如果我在 x86 上安裝 Rustup 和 Cargo 到預設的路徑 ~/.rustup 和 ~/.cargo,假設我安裝了 exa ,切換到 Arm 上後就會跳出下面這樣的錯誤訊息: -bash: /xxx/.cargo/bin/exa: cannot execute binary file 原因 因為 Cargo 的 packages 當初是在 x86 上編譯的,當然就沒辦法在 Arm 平台上執行。 解決方式 第一個直覺想法就是,有沒有辦法在 x86 與 Arm 上都安裝同一個 package,只是安裝在不同路徑。查了一下網路就看到如何 客製化 Rustup/Cargo 安裝在自訂的路徑 : Rustup: 執行 rustup-init 前設定 RUSTUP_HOME Cargo: 執行 rustup-init 前設定 CARGO_HOME 利用這樣的環境變數,我們就可以寫一些 Bash scripts 來達到多個 OS 上的安裝和動態切換。 Bash Script: 安裝 Rustup 在不同的 OS 上 例如我們在 x86 上安裝就可以這樣寫: #!/bin/bash export RUSTUP_HOME="$HOME/x86_64/rustup" export CARGO_HOME="$HOME/x86_64/cargo" cd "$RUSTUP_HOME" # Download rustup script curl https://sh.rustup.rs -sSf >rustup.sh # Install rustup bash rustup.sh -y --no-modify-path 在 Arm 上安裝就換一下 RUSTUP_HOME 和 CARGO_HOME 路徑就好: #!/bin/bash export RUSTUP_HOME="$HOME/arm64/rustup" export CARGO_HOME="$HOME/arm64/cargo" cd "$RUSTUP_H...

此網誌的熱門文章

[試算表] 追蹤台股 Google Spreadsheet (未實現損益/已實現損益)

互動式教學神經網路反向傳播 Interactive Computational Graph

[Side Project] Google Apps Script 實作 Google Sheet 抽股票的篩選工具