Rust 是一种现代编程语言,专为性能敏感和系统级开发设计。 Rust 的关键特性之一是其所有权系统,该系统赋予开发者内存安全的同时不影响性能。 此外,Rust 支持多种并发模型,使得用 Rust 策划并发爬虫或者并发 web server 成为可能。本文将深入探讨 Rust 的这些特性。
并发模型
在 Rust 里,可以通过两者方式来进行并发编程:线程模型和消息传递模型。
- 线程模型:Rust 的标准库提供了一套包含线程创建、锁和其他并发原语的完整工具集合。并发包
std::thread
可以轻易地创建线程以运行一个闭包,并获取其返回值。
rust
use std::thread;
use std::time::Duration;
fn main() {
let handle = thread::spawn(|| {
for i in 1..10 {
println!("hi number {} from the spawned thread!", i);
thread::sleep(Duration::from_millis(1));
}
});
for i in 1..5 {
println!("hi number {} from the main thread!", i);
thread::sleep(Duration::from_millis(1));
}
handle.join().unwrap();
}
- 消息传递模型:Rust 通过
std::sync::mpsc
使用了一种多生产者单消费者 (MPSC) 的消息队列模型。这种模型允许多个线程共享数据,而无需显式的同步操作。
rust
use std::thread;
use std::sync::mpsc;
fn main() {
let (tx, rx) = mpsc::channel();
thread::spawn(move || {
let val = String::from("Hello");
tx.send(val).unwrap();
});
let received = rx.recv().unwrap();
println!("Got: {}", received);
}
所有权系统
在 Rust 中,所有权系统用于管理内存。这是通过一些规则实现的,编译器在编译时就会检查这些规则。
- 变量取值默认是移动语义,也就是深拷贝。这一点在处理动态内存数据结构时表现的尤为重要。例如:
rust
let s1 = String::from("hello");
let s2 = s1;
println!("{}, world!", s1);
上述代码会在编译时报错,因为 s1
在 let s2 = s1;
语句后就失去了所有权,不能再被使用。
- 在函数中,所有权也会被转移。
rust
fn main() {
let s = String::from("hello");
takes_ownership(s);
//`s` 的所有权已经被 `takes_ownership` 所获得,这里再使用就会编译错误
//println!("In main: {}", s);
}
fn takes_ownership(some_string: String) {
println!("{}", some_string);
}
通过所有权和这两种并发模型,Rust 成为了一种有内存安全保证,性能强大的并发编程语言。并发编程并优秀的类型系统使 Rust 成为系统编程和开发高性能应用的绝佳选择。