Câu hỏi phỏng vấn Rust
Câu hỏi

Explain the use of a...

Câu trả lời

The async/.await syntax in Rust is a powerful tool for writing asynchronous code that appears synchronous, making it easier to read and maintain. Here’s a detailed explanation of how it works and its use in Rust:

Overview of async/.await

  1. Asynchronous Functions:

    • The async keyword is used to define an asynchronous function. When you mark a function with async, it transforms the function into one that returns a Future instead of executing immediately. This Future represents a value that will be available at some point in the future.
    • Example:
      async fn fetch_data() -> Result<String, Error> {
          // Asynchronous operations here
      }
  2. Awaiting Futures:

    • The .await keyword is used within an async function to pause its execution until the Future it is awaiting is resolved. This allows other tasks to run concurrently while waiting for the asynchronous operation to complete.
    • Example:
      async fn main() {
          let data = fetch_data().await.unwrap();
          println!("Data: {}", data);
      }

How async/.await Works

  1. State Machines:

    • Under the hood, async functions in Rust are implemented as state machines. When an async function is called, it returns a Future that contains the state machine. The state machine progresses through its states as the Future is polled, eventually reaching a final state where it returns a value or an error[2][5].
  2. Polling and Executors:

    • Futures in Rust are lazy and do not start executing until they are polled. The poll method is repeatedly called on the Future until it returns Poll::Ready, indicating that the operation is complete[2][8].
    • Rust does not include a built-in runtime to drive these Futures to completion. Instead, you need to use an executor, such as Tokio or async-std, which schedules and runs the asynchronous tasks[3][6][8].
  3. Concurrency and Non-blocking:

    • The async/.await model allows for non-blocking concurrency. When an async function encounters an .await, it yields control back to the executor, allowing other tasks to run. This is particularly useful for I/O-bound operations where waiting for external resources (like network requests) would otherwise block the thread[3][5][10].

Example with Tokio

Here’s a simple example using the Tokio runtime to demonstrate async/.await in Rust:

use tokio::net::TcpStream;

#[tokio::main]
async fn main() {
    match TcpStream::connect("127.0.0.1:8080").await {
        Ok(stream) => println!("Connected to the server!"),
  ...
expert

expert

Gợi ý câu hỏi phỏng vấn

middle

Does Rust support OOP?

senior

Explain what is Send and Sync in Rust and when do you need them?

junior

Is there a way to directly convert a String to an int ?

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào