Sửa lỗi Rust E0599: Thiếu phương thức 'spawn' trong tokio::runtime::Runtime

beginner🦀 Rust2026-07-20| Rust 1.45+, Cargo, Tokio crate 1.x

Error Message

error[E0599]: no method named 'spawn' found for struct 'tokio::runtime::Runtime' in the current scope
#rust#tokio#cargo#async

Kịch bảnBạn đã quyết định quản lý Tokio runtime theo cách thủ công thay vì sử dụng macro #[tokio::main] tiêu chuẩn. Bạn thêm dependency vào Cargo.toml, khởi tạo runtime và thử spawn một task. Trên lý thuyết, mã nguồn trông hoàn toàn giống với tài liệu hướng dẫn. Tuy nhiên, cargo build thất bại ngay lập tức với một lỗi gây bối rối.

use tokio::runtime::Runtime;

fn main() {
    let rt = Runtime::new().unwrap();
    
    // Trình biên dịch coi như phương thức này không tồn tại
    rt.spawn(async {
        println!("Xin chào từ runtime");
    });
}

Kết quả đầu ra của trình biên dịch trông như thế này:

error[E0599]: no method named 'spawn' found for struct 'tokio::runtime::Runtime' in the current scope
  --> src/main.rs:7:8
   |
7  |     rt.spawn(async {
   |        ^^^^^ method not found in 'tokio::runtime::Runtime'

Tại sao phương thức lại bị thiếu?Các crate trong Rust thường sử dụng Feature Flags để tối ưu hóa quá trình biên dịch. Tokio là một thư viện đồ sộ. Nó xử lý mọi thứ từ các TCP socket cấp thấp đến lập lịch tác vụ cấp cao. Nếu Cargo tải xuống và biên dịch mọi thành phần theo mặc định, thời gian build của bạn sẽ bị ảnh hưởng đáng kể.

Khi bạn thêm tokio = "1.35" vào cấu hình, Cargo chỉ kích hoạt các feature "mặc định". Đối với Tokio, bộ mặc định gần như trống rỗng. Nó bao gồm các kiểu dữ liệu cơ bản nhưng loại trừ logic runtime thực tế. Điều này có nghĩa là phương thức spawn thực sự bị loại bỏ khỏi bản build của bạn để tiết kiệm dung lượng. Phương thức spawn được biên dịch có điều kiện. Nó chỉ tồn tại nếu bạn yêu cầu rõ ràng các feature rt hoặc rt-multi-thread. Nếu không có chúng, trình biên dịch sẽ thấy struct Runtime nhưng không thấy các phương thức liên quan. Đây là lý do tại sao bạn nhận được lỗi E0599 thay vì lỗi thiếu crate.

Cách khắc phục nhanhCách nhanh nhất để giải quyết vấn đề này là kích hoạt bộ feature full. Nó bao gồm mọi công cụ mà Tokio cung cấp. Hãy mở terminal tại thư mục gốc của dự án và chạy:

cargo add tokio --features full

Lệnh này sẽ tự động cập nhật Cargo.toml của bạn. Nó đảm bảo rằng spawn, block_on và tất cả các networking trait đều sẵn sàng để sử dụng. Cách này hoàn hảo cho việc làm prototype hoặc các dự án nhỏ nơi kích thước file thực thi không phải là vấn đề quá khắt khe.

Cách khắc phục chính xác cho ProductionSử dụng features = ["full"] có thể là quá mức cần thiết cho môi trường production. Nó có thể kéo theo hơn 30 dependency bổ sung mà bạn không thực sự cần. Điều này có thể làm tăng kích thước file thực thi cuối cùng thêm vài megabyte. Để giữ cho bản build gọn nhẹ, hãy chỉ kích hoạt các feature cụ thể cần thiết cho struct Runtime.

Chỉnh sửa file Cargo.toml và cập nhật mục Tokio:

[dependencies]
tokio = { version = "1.35", features = ["rt", "rt-multi-thread"] }

Phân tích các Feature phổ biến- rt: Cung cấp runtime đơn luồng cơ bản.- rt-multi-thread: Yêu cầu nếu bạn sử dụng Runtime::new(), vốn mặc định sử dụng bộ lập lịch đa luồng.- macros: Kích hoạt nếu bạn muốn sử dụng #[tokio::main].- net: Cần thiết cho TcpStream hoặc UdpSocket.- time: Cần thiết cho tokio::time::sleep và các timeout.Một thiết lập tiêu chuẩn cho một web service thường yêu cầu sự kết hợp như thế này:

[dependencies]
tokio = { version = "1.35", features = ["rt-multi-thread", "macros", "net", "time"] }

Nhận biết các Feature bị thiếu trong các Crate khácVấn đề này thường xuyên xảy ra với các crate Rust phức tạp. Nếu bạn thấy lỗi E0599 trên một kiểu dữ liệu lẽ ra phải có một phương thức cụ thể, hãy kiểm tra tài liệu trên docs.rs. Tìm thẻ ghi "This is supported on feature X only." Nếu thẻ đó xuất hiện, bạn phải thêm feature đó vào manifest của mình.

Xác minhBạn không cần đợi biên dịch xong hoàn toàn để biết kết quả. Hãy chạy cargo check. Lệnh này thực hiện kiểm tra kiểu dữ liệu nhanh chóng mà không tạo ra file thực thi. Nếu lỗi E0599 biến mất, feature flag đã được cấu hình chính xác.

Ví dụ hoạt độngSau khi bạn đã kích hoạt rtrt-multi-thread, mã nguồn này sẽ biên dịch và chạy được:

use tokio::runtime::Runtime;

fn main() {
    // Runtime::new() yêu cầu "rt-multi-thread"
    let rt = Runtime::new().expect("Không thể tạo runtime");

    rt.block_on(async {
        println!("Runtime đang hoạt động.");
        
        // Việc spawn task yêu cầu feature "rt"
        tokio::spawn(async {
            println!("Task đã được spawn thành công!");
        }).await.unwrap();
    });
}

Related Error Notes