Rust in Action笔记 第十章 进程、线程和容器

  1. Rust的闭包也就是类似lambda表达式,大致的格式是|a, b| {...} ,竖线里面的是参数,花括号里面的是函数逻辑;
  2. 通过thread::spawn(|| {})产生的线程,括号内的参数实际上就是一个闭包,因为创建新的线程不需要参数,因此就是两个竖线跟着一个花括号里面要做的事;如果闭包里面要用到外面的变量,就必须在前面加上move关键字,把外面的变量“捕获”(capture)到闭包内部,为什么要move到闭包内部,因为闭包的逻辑由新产生的线程来完成,他可能比外面的线程活得久(outlive),而Rust总是要求访问的数据是有效的,因此要把外部的变量的所有权移动(move)到闭包内部,如果不想使用move,可以有两个方案,一个是为需要move的变量实现Copy特征,另一个是把要移动的变量设置为Static
  3. 当spawn了多个线程,并把handle放到一个Vec<thread::JoinHandle<()>>中时,如果要join所有的handle,书上不建议用for loop,而是while let Some(handle) = handlers.pop() {},因为for循环不允许对遍历的变量进行修改而while可以,(实际上for循环现在也可以修改);
  4. 闭包实际上是一个匿名struct,实现了std::ops::FnOnce特征,可能实现了std::ops::Fn或者std::ops::FnMut;函数(function)实际上是一个函数指针(function pointer),函数指针指向的是代码(code)而不是数据(data),在这种场景下,代码(code)是被标记为可执行(executable),在一些复杂的情况下,没有捕获参数的闭包也是函数指针;
  5. 多线程访问同一个变量的方法最常用的是用Arc<Mutex<T>>来包裹住要访问的数据T;另一种是采用Channels来制造一个发送端Sender和接收端Receiver;
  6. Channel是单向传输的,如果需要双向传输(duplex),书上的建议是创建两个Channel,每个channel对应一个方向,channel可以用于实现一个任务队列(task queue),详见Page358;
  7. 任务的规模和并发度是有一个取舍的,在10.5节的图中有一个简单的阐述,最左边的Green Thread可以理解为是协程Figure 10.58. 10.5节分别从小到大讲了几个计算机处理任务的单元,从线程、进程、WebAssembly、容器(container)、操作系统,值得注意的是,WASM比进程更大一级,在web这个运行时里,每一个WASM模块里的程序都是隔离的(体现在内存隔离、任务不相干扰),这一点跟进程类似,但WASM又运行在浏览器上,进程是在操作系统上,这一点可以看出WASM处于进程和操作系统之间;容器(Containers)有点类似K8s中的pod概念,进程共享一个文件系统(file system),而Containers自带文件系统;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值