#thread-pool #scoped #state #stateful #pool

pond

一个用于具有状态的缓存线程池的库

4个版本

使用旧的Rust 2015

0.3.1 2018年12月18日
0.3.0 2018年7月9日
0.2.3 2017年12月21日
0.2.2 2017年11月25日

#292内存管理


grenade 中使用

BSD-2-Clause

28KB
835

GitHub license Crates.io Documentation

[dependencies]
pond = "0.3"

简介

又一种作用域线程池的实现。

作用域线程池允许在当前函数作用域中执行许多任务,这意味着数据不需要有 'static 生命周期。

这个有一个额外能力,可以在每个线程中存储可变状态,这允许你,例如,为每个线程重用昂贵的数据库连接。此外,你可以设置一个队列,以防止在有很多作业要启动时内存使用量激增。

用例

如果你需要与数据库服务器建立多个连接,没有这个crate,你需要某种连接池库,因此每个连接都需要Rust的 Send 能力。此外,无法保证你的连接池器会在相同的线程上保持连接。

使用这个crate,你提供一个设置连接的函数,然后该函数在初始化时在每个线程中被调用。可变引用被传递给你的作业闭包。确保每个作业在作业之间保持数据库连接在合理状态是作业的责任。

使用状态制作能力是可选的。如果你没有调用 with_state 函数,那么你的作业闭包不需要任何参数,这使得这个crate与其他作用域线程池库兼容。

示例

extern crate pond;
let mut pool = pond::Pool::new();

let mut vec = vec![0, 0, 0, 0, 0, 0, 0, 0];

// Each thread can access the variables from
// the current scope
pool.scoped(
    |scoped|
    {
        let scoped = scoped.with_state(
            || "costly setup function".len()
        );
        // each thread runs the above setup function

        // Create references to each element in the vector ...
        for e in &mut vec
        {
            scoped.execute(
                move |state|
                {
                    *e += *state;
                    assert_eq!(*e, 21);
                }
            );
        }
    }
);

变更日志

  • 0.3.0 (2018-07-09):现在 Pool 的构造函数在一般情况下默认为本地线程数,队列不再是无界的。我发现这使得错误更少,更不必要地冗长。

另请参阅

依赖关系

~77KB