Rust的併發程式設計(一)多程序併發

2021-10-24 12:29:37 字數 2420 閱讀 2687

併發,是指在巨集觀意義上同一時間處理多個任務。併發的方式一般包含為三種:多程序、多執行緒以及最近幾年剛剛火起來的協程。

首先,我們建立兩個專案,乙個為子程序,乙個為主程序。在子程序的main.rs中,編寫如下**:

use std::thread::sleep;

use std::time::duration;

fn main()

程式先輸出"hello, world!",然後休息5秒鐘,最後列印"bye, world!"退出。

在主程序的main.rs中,編寫如下**:

use std::process::command;

fn main()

執行主程序時,發現子程序輸出了"hello, world!",但是沒有下文了。有經驗的我們都知道,這是因為主程序啟動了子程序後立刻退出了。我們需要等待子程序結束。

要等待子程序結束,需要使用乙個變數儲存子程序物件,然後呼叫子程序的wait方法:

use std::process::command;

fn main()

需要注意的是,因為wait方法會改變子程序物件的狀態,所以子程序物件必須是可變的。

與wait對應的,還有乙個try_wait方法,try_wait不會阻塞主程序,無論子程序是否結束,都會返回result,並將狀態儲存到ok中:

use std::thread::sleep;

use std::time::duration;

use std::process::command;

fn main() else

break;

}none => }}

}

ok中儲存是乙個option,當子程序結束時,為some,沒有程序時為none。

修改一下子程序,使子程序可以通過命令列引數來決定sleep的時間。接收命令列引數可以使用標準庫的env模組:

use std::env::args;

use std::thread::sleep;

use std::time::duration;

fn main()

args返回乙個比較複雜的結構,可以用nth來取得第幾個引數的值,第0個是exe的名稱,第1個是傳給exe的第1個引數。因為nth有可能是none,所以返回的是option,可以用unwrap()取得引數的字串。

duration::from_secs接收的是u64型別,需要把字串使用parse::()轉成u64型別,轉換過程可能會失敗,所以parse返回result,同樣可以使用unwrap()取得轉換後的值。

接下來,該修改主程序了。主程序的修改比較簡單,只需要在command::new之後新增.arg即可:

use std::process::command;

fn main()

如果是多個引數,可以使用args函式,將引數合併成乙個陣列傳入就可以了。

rust當然也可以通過管道進行程序間通訊。修改子程序**,將函式的引數設定為接收資料的條數,每接收到一條資料就原樣返回,直到達到設定的條數後退出:

use std::io;

use std::env::args;

fn main() ", s.trim()); // trim掉最後的\n

index += 1;

}

println!("bye, world!");

}

然後在主程序中,迴圈向子程序的標準輸入裡寫入訊息,並讀取標準輸出的內容:

use std::process::;

use std::io::;

fn main() ", line);

// 循化傳送訊息

for msg in msglist.iter() ", msg);

p_stdin.write(msg.as_bytes()).unwrap();

p_stdin.write("\n".as_bytes()).unwrap(); // 傳送\n,子程序的read_line才會響應

// 接收訊息

line.clear(); // 需要清空,否則會保留上次的結果

p_stdout.read_line(&mut line).unwrap();

println!("read from stdout:{}", line);

}// 接收bye world

line.clear();

p_stdout.read_line(&mut line).unwrap();

println!("{}", line);

// 等待子程序結束

p.wait().unwrap();

}

Python併發機制的實現 一 多程序

python併發機制的實現 一 多程序 unix linux系統呼叫實現多程序 windows系統不支援 unix linux作業系統提供了乙個fork 系統呼叫,它非常特殊。普通的函式呼叫,呼叫一次,返回一次,但是fork 呼叫一次,返回兩次,因為作業系統自動把當前程序 稱為父程序 複製了乙份 稱...

python併發程式設計 多程序

import os import time from multiprocessing import process def func args,args2 print args,args2 time.sleep 3 print 子程序 os.getpid print 子程序的父程序 os.getpp...

併發程式設計 多程序1

實現原理 統一時間,載入多個任務到記憶體中,多個程序之間記憶體區域需要相互隔離,這種隔離是物理層面的隔離,其目的是為了保證數安全 指的是,作業系統會在多個程序之間做切換執行 切換任務的兩種情況 1.當乙個程序遇到了io操作 時會自動切換 2.當乙個任務執行時間超過閾值會強制切換 注意 在切換前必須儲...