Rust-并行&并发(一)

有关於并行和并发的定义每个人可能有不一样的解释

  • 并行指的是在同一时刻,多条指令在 CPU 上同时执行
  • 并发指的是在同一时间区间内,多条指令在 CPU 上同时执行

Rust以安全高效处理并行程序设计着称

透过spawn建立新的执行绪

use std::thread;
use std::time::Duration;

fn main() {
    thread::spawn(|| {
        for i in 1..10 {
            println!("{}", i);
            thread::sleep(Duration::from_millis(1)); // 让执行短暂sleep一下
        }
    });

    thread::sleep(Duration::from_millis(5)); // 让执行短暂sleep一下
}

透过范例可以看到印出来并不是如预期的都会把1-10印出来,主要是因为main已经执行完退出造成新建的执行绪还没跑完就被中断了,虽然可以透过更久的sleep让main晚点退出但是有更好的作法

使用join等待所有执行绪完成

use std::thread;
use std::time::Duration;

fn main() {
    let handle = thread::spawn(|| {
        for i in 1..10 {
            println!("{}", i);
            thread::sleep(Duration::from_millis(1)); // 让执行短暂sleep一下
        }
    });

    handle.join().unwrap(); // (Blocking)让全部执行完才继续往下
}

透过储存thread::spawn回传的数值为变数,可以修正产生的执行绪完全没有执行或没有执行完成的问题。handle呼叫join方法来确保产生的执行绪会在main离开之前完成

透过执行绪使用move闭包

闭包透过move让thread::spawn执行绪可以使用其他执行绪的资料。

use std::thread;

fn main() {
    let v = vec![1, 2, 3];

    let handle = thread::spawn(move || { // 透过move让执行绪可以拥有v变数的所有权
        println!("{:?}", v);
    }); // 在这个执行绪执行完之前v所有权都不会释放

    handle.join().unwrap();
}

<<:  Day 23: WAF web ACL、rules group建立

>>:  [NestJS 带你飞!] DAY20 - File Upload

[Day3] 使用ta-lib制作指标

延续前一天的程序码,在程序码後面加上以下三行程序码,他就会用前一天做出来的日收盘价计算出均线(预设算...

我们的基因体时代-AI, Data和生物资讯 Day28-COVID大数据:资料哪里来

上一篇我们的基因体时代-AI, Data和生物资讯 Day27-进阶人工智慧在分子生物学之应用又是明...

Day20_CSS语法3

ID选择器(ID selector) : 符合指定id的HTML元素做为要套用样式规则的对象,命名格...

Day27 - 很像 Vue 的 AlpineJS(二): 常用属性

透过 x-data 宣告一个 Alpine 元件後就可以来操作里面的内容啦!今天会大略介绍一些比较常...

【Day 13】颜立委:希望你们都学会,如何透过 SMTP 发信!

tags: 铁人赛 SMTP gmail 中部粽 前情提要 昨天,我们一边执行程序码、一边产生 lo...