#thread-pool #thread #pool #threading

dynpool

轻量级、灵活且可伸缩的线程管理器

3 个版本

使用旧的 Rust 2015

0.0.2 2019年9月4日
0.0.1 2018年10月24日
0.0.0 2018年10月23日

#991并发

MIT 许可证

39KB
578 代码行

Build Status

Dynpool

Dynpool 是一个轻量级、灵活且可伸缩的线程管理器。该池旨在最小化开销,无需昂贵的锁或额外的管理线程。您可以自己添加工作队列,也可以不添加!

要使用 dynpool,您只需要一个 System 的实现。池将重复调用来自多个线程的 System::work,每个线程都有自己的数据对象。与要求您从外部调整池的大小不同,dynpool 将不断从 System::scale 查询工作线程数。这实际上更快,因为简单的 scale 实现可以内联到工作线程中!您可以在后台运行系统,并通过 Pool 对象进行控制,或者在前台运行以利用当前线程。

struct Printer(Instant);

impl System for Printer {
    type Data = String;

    // How many threads? The pool will scale up over time!
    fn scale(&self) -> Scale {
        let time = self.0.elapsed();
        let ms = time.as_secs() * 1000 + time.subsec_millis() as u64;
        match ms {
            0..=200 => Scale::active(1),
            201..=400 => Scale::active(2),
            401..=600 => Scale::active(3),
            601..=800 => Scale::active(4),
            _ => Scale::shutdown(),
        }
    }

    // Pick a string for each thread.
    fn init(&self, index: usize) -> String {
        match index {
            0 => "Hello",
            1 => "Hola",
            2 => "Bonjour",
            3 => "Ciao",
            _ => unreachable!(),
        }.to_owned()
    }

    // Do work on several threads!
    fn work(&self, text: &mut String) -> Decision {
        println!("{}", text);
        *text += " Again";
        sleep(Duration::from_millis(100));
        Decision::Again
    }
}

fn main() {
    Pool::start_fg(Printer(Instant::now())).unwrap();
    println!("This is the end!");
}

还有用于简洁地更改和构建系统的内置函数。

let workers = func_worker(|index| {
    println!("New worker #{}", index);
    move || {
        println!("Hello from #{}", index);
        Decision::Again
    }
});
let sys = with_threads(workers, 10);
let end_time = Instant::now() + Duration::from_millis(500);
Pool::start_fg(shutdown_after(sys, end_time)).unwrap();

依赖项

~0.6–0.8MB
~11K SLoC