threadpool ใน Rust แบบจำกัดขนาด job queue

ปกติเวลาใช้ threadpool มันจะเอา job ใส่ queue ไปเรื่อย ๆ เลย สมมุติว่าสัก 10 ล้าน job แล้วแต่ละ job มันทำงานช้า queue มันก็อาจจะกลายเป็นว่า queue ที่ใช้ channel มาทำมันใช้ memory เยอะเพราะมี job คาอยู่ใน channel เพียบเลย

 


extern crate threadpool;

use threadpool::ThreadPool;
use std::time::Duration;

fn main() {
    let pool = ThreadPool::new(3);
    
    for i in 0..100 {
        println!("Enqueue: {}", i);
        pool.execute(move|| {
            std::thread::sleep(Duration::from_millis(1000));
            println!("Dequeue: {}", i);
        });
    }
    pool.join();
}


ถ้าเขียน code ด้านบนมันจะ enqueue 0 ถึง 99 จนครบเลย แล้วค่อย dequeue ออกมาดังนั้น channel ก็จะกิน memory ตามนั้น แต่ผมไม่อยากได้แบบนี้ ผมอยากให้แบบพอใส่ไป สัก 0..5 แล้วก็ให้หยุดใส่ก่อน จะได้ไม่กิน memory มาก ก็เลยไปโมให้ pool.execute มัน block หรือหยุดก่อนเวลา queue มีขนาดประมาณหนึ่ง ซึ่งก็แก้ตาม commit/changeset นี้ หลัก ๆ ก็คือไปเปลี่ยน channel เป็น sync_channel แทน

พอแก้เสร็จเสร็จแล้วรันโปรแกรมอีกทีก็จะเห็น enqueue ประมาณ 3 (ยกเว้นตอนเริ่ม) ครั้ง กับ dequeue ประมาณ 3 ครั้งสลับกันไปประมาณ

จริง ๆ ผมก็ไม่แน่ใจว่าทำแบบนี้ดีหรือเปล่า ก็เลยมาเขียน blog เล่าให้ฟังถ้าหากมีอะไรเพิ่มเติมโปรดชี้แนะด้วยครับ

Advertisements
This เรื่อง was posted in ไม่มีหมวดหมู่. Bookmark the permalink.

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s