我需要在一组任务之间分派工作。std::sync::deque 足以解决这个问题,但如果队列为空,我需要阻塞任务。
以下代码(在 GitHub gist 中可用)是使用
以下代码(在 GitHub gist 中可用)是使用
std::sync::deque
的工作示例:extern crate time;
use std::io::timer::sleep;
use std::sync::deque::{BufferPool, Empty, Abort, Data};
use std::time::Duration;
fn main() {
let start = time::precise_time_s();
let pool = BufferPool::new();
let (worker, stealer) = pool.deque();
for task_id in range(1i, 5) {
let sc = stealer.clone();
spawn(proc() {
loop {
let elapse = time::precise_time_s() - start;
match sc.steal() {
Empty => { println!("[{} @ {:#7.4}] No items", task_id, elapse); sleep(Duration::milliseconds(300)) },
Abort => println!("[{} @ {:#7.4}] ABORT. Retrying.", task_id, elapse),
Data(item) => println!("[{} @ {:#7.4}] Found {}", task_id, elapse, item)
}
}
});
}
for item in range(1i, 1000) {
for n in range(1i, 20) {
worker.push(item * n);
}
sleep(Duration::milliseconds(1000));
}
}
我看到有一个std::sync::TaskPool,但是当前实现即使线程忙于旧任务,也会将工作发送到任务中。
我的问题是:如何最好地阻止任务,直到队列中有任何项目?
steal()
直到获取数据。 - Arjanloop
来包装steal()
,为此问题更新了gist中的修复程序。差异在https://gist.github.com/ayosec/aee066d5e5a3f38c66b9/revisions中可见。 - Ayose