Concurrency ใน Rust: ใช้ thread, async/await, และ tokio

Sharing is caring!

Rust มีความสามารถในการจัดการ concurrent programming ที่ปลอดภัยและทรงพลัง บทความนี้จะพาคุณไปรู้จักกับแนวทางการเขียน concurrent code ใน Rust ด้วย thread, async/await และ tokio ซึ่งเป็น runtime ที่ได้รับความนิยมสูง

การใช้ Thread ใน Rust

Rust รองรับการสร้าง thread ได้โดยตรงผ่าน std::thread ซึ่งมี API ที่ง่ายและปลอดภัยแบบ ownership-based

use std::thread;
use std::time::Duration;

fn main() {
    let handle = thread::spawn(|| {
        for i in 1..5 {
            println!("thread: {}", i);
            thread::sleep(Duration::from_millis(100));
        }
    });

    for i in 1..5 {
        println!("main: {}", i);
        thread::sleep(Duration::from_millis(100));
    }

    handle.join().unwrap();
}

โดยค่า ownership ของตัวแปรใน closure จะต้องส่งเข้าไปอย่างเหมาะสม เช่นใช้ move

การใช้ async/await ใน Rust

ตั้งแต่ Rust 1.39 เป็นต้นมา เราสามารถใช้ async/await เพื่อเขียนโค้ดแบบ asynchronous ได้ง่ายมากขึ้น

async fn say_hello() {
    println!("Hello from async!");
}

#[tokio::main]
async fn main() {
    say_hello().await;
}

async fn จะคืนค่าเป็น Future ซึ่งสามารถ await ได้ใน context ที่เป็น async เท่านั้น

ทำความรู้จักกับ tokio

tokio คือ asynchronous runtime ที่มี scheduler ประสิทธิภาพสูง มีทั้ง multi-thread และ single-thread runtime

ติดตั้ง

# Cargo.toml

[dependencies]

tokio = { version = “1”, features = [“full”] }

ใช้งาน async task

use tokio::time::{sleep, Duration};

#[tokio::main]
async fn main() {
    let task = tokio::spawn(async {
        sleep(Duration::from_secs(1)).await;
        println!("async task done!");
    });

    task.await.unwrap();
}

การสื่อสารระหว่าง task/thread ด้วย channel

Rust มี channel สำหรับการส่งข้อมูลระหว่าง threads และ tasks ทั้งแบบ sync และ async

use tokio::sync::mpsc;

#[tokio::main]
async fn main() {
    let (tx, mut rx) = mpsc::channel(32);

    tokio::spawn(async move {
        tx.send("hello").await.unwrap();
    });

    while let Some(msg) = rx.recv().await {
        println!("Received: {}", msg);
    }
}

Thread vs Async vs Tokio

คุณสมบัติThreadAsync/AwaitTokio
การรันพร้อมกันแท้จริง (OS thread)จำลอง (Future)จัดการโดย runtime
ประสิทธิภาพใช้ CPU/Memory สูงประหยัดทรัพยากรดีเยี่ยม
เหมาะกับงาน CPU-boundงาน I/O-boundงาน I/O-bound หลาย task

บทสรุป

Rust ให้เครื่องมือสำหรับการทำ concurrent programming ที่หลากหลาย ตั้งแต่ thread แบบพื้นฐาน ไปจนถึง async/await และ runtime อย่าง tokio ที่สามารถจัดการ task นับพัน ๆ ได้อย่างมีประสิทธิภาพ การเลือกใช้ให้เหมาะสมกับลักษณะงานจะช่วยเพิ่ม performance และความปลอดภัยให้กับโปรเจกต์ของคุณ

บทความโดย poolsawat.com – Rust Programming สำหรับระบบที่เร็ว ปลอดภัย และทันสมัย

Leave a Reply

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *