如上所述,Golang 支持并发。例如,假设您正在运行一个处理 API 请求的 Web 服务器。您可以使用 Golang 的 goroutine 程序将每个请求作为 goroutine 运行,通过将任务分发到所有可用的 CPU 内核来最大程度地提高效率。
Goroutines 是 Golang 内置功能的一部分,而 Rust 仅支持本地 async/await 语法来支持并发。因此,在并发方面,Golang 的开发人员有经验优势。但是,Rust 在保证内存安全方面要好得多。
这是 Rust 的简化线程的示例:
use std::thread; use std::time::Duration; fn main() { // 1. create a new thread thread::spawn(|| { for i in 1..10 { println!("thread: number {}!", i); thread::sleep(Duration::from_millis(100)); } }); println!("hi from the main thread!"); }并发一直是开发人员的棘手问题。在不影响开发人员体验的情况下保证内存安全的并发性并不是一项容易的任务。但是,这种极端的安全重点导致创建了可证明正确的并发[5]。Rust 尝试使用所有权概念来防止未经请求的资源访问,以防止出现内存安全错误。
Rust 提供了四种不同的并发范例,以帮助您避免常见的内存安全陷阱。我们将仔细研究两个常见的范例:channel 和锁。