异步 Rust 中的一个实验

主要观点:介绍了一些编程语言中的async / await语法,以 Rust 为例,探讨其在普通函数中的使用及实现单线程并发的原理,还提出了一些关于async的深入问题供研究。
关键信息:

  • async / await并非所有语言都支持,如 Python、Typescript、C#、Rust 等支持该特性,而 Go、Java 和 Elixir 等通过其他机制处理异步问题。
  • 示例程序展示了普通的计算函数print_fibonacciprint_squares,它们按顺序执行。
  • 通过手动合并函数可实现并发,但较复杂,async提供了更好的方式,如async版本的print_fibonacci_asyncprint_squares_async,通过concurrent函数以交错方式执行它们的异步代码。
  • async函数的执行是逐步的,而非一次运行完,通过wait_until_next_poll().await来触发暂停和继续执行,不同的await操作对执行的影响不同。
    重要细节:
  • async函数中,调用partially_execute可逐步执行函数体,如let mut obj = print_squares_async(5); obj.partially_execute();
  • concurrent函数本质上是一个循环,交错调用partially_execute直到所有函数执行完毕。
  • async函数返回的对象称为future,实现了Future trait,其主要方法是Future::poll
  • print_squares_asyncwait_until_next_poll().await用于触发暂停,计算序列下一个数字本身不需要等待时,整个函数会一次运行完。
  • 提出了关于async的一些深入问题,如partially_execute函数与Future::poll的参数差异及Context的作用、wait_until_next_poll的定义、Pin的相关问题以及单线程并发中 CPU 密集型函数的处理等。
阅读 22
0 条评论