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 中使用
28KB
835 行
[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
的构造函数在一般情况下默认为本地线程数,队列不再是无界的。我发现这使得错误更少,更不必要地冗长。
另请参阅
- scoped-threadpool (具有非常相似的API,但没有状态)。请警惕 一个严重的错误。
- scoped_pool (非常灵活,但没有状态)
- crossbeam (没有实现线程池)
依赖关系
~77KB