Rust 学习笔记:关于通过异步实现并发的练习题
Rust 学习笔记:关于通过异步实现并发的练习题
- Rust 学习笔记:关于通过异步实现并发的练习题
- 问题一
- 问题二
- 问题三
Rust 学习笔记:关于通过异步实现并发的练习题
参考视频:
- https://www.bilibili.com/video/BV16JZSYxEeb
问题一
该函数的输出是什么?
async fn print_letters() {let a = async { println!("A") };let b = async { println!("B") };let c = async { println!("C") };c.await;b.await;a.await;
}
答:
C
B
A
问题二
假设有这样一个异步函数:
async fn print_letters() {let fut1 = async {print!("A");sleep().await;print!("B");};let fut2 = async {print!("C");sleep().await;print!("D");};wait_all(fut1, fut2).await;
}
wait_all(a, b) 保证 a 和 b 都执行完,但不保证公平性和初始执行顺序。
print_letters().await 可能的结果是?
A. DABC
B. ABCD
C. CADB
D. ACBD
答:B、C、D。
问题三
假设有如下异步代码:
let (tx, mut rx) = channel(16);let recv_fut = rx.recv();let send_fut = tx.send(0);let (n, _) = join(recv_fut, send_fut).await;println!("{}", n.unwrap());
channel 是无阻塞且 bounded 的,这意味着 send 返回一个 future,当通道还有容量时该 future 会完成。并且 join(a, b) 会公平地等待其两个参数完成。
执行这段代码会发生什么?
A. 程序什么也不打印并永远循环
B. 程序打印 0 并永远循环
C. 程序打印 0 并退出
D. 程序 panic
答:C。