併發,是指在巨集觀意義上同一時間處理多個任務。併發的方式一般包含為三種:多程序、多執行緒以及最近幾年剛剛火起來的協程。
首先,我們建立兩個專案,乙個為子程序,乙個為主程序。在子程序的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.當乙個任務執行時間超過閾值會強制切換 注意 在切換前必須儲...