加入有限并发的期货

时间:2017-04-06 06:20:11

标签: rust

我有一个超级HTTP请求期货的大量向量,并希望将它们解析为结果向量。由于存在最大打开文件的限制,我想将并发限制为N个未来。

我已经尝试Stream::buffer_unordered,但似乎是逐个执行期货。

1 个答案:

答案 0 :(得分:4)

我们在项目中使用了code like this来避免打开过多的TCP套接字。这些期货内部都有Hyper期货,所以看起来完全相同的情况。

// Convert the iterator into a `Stream`. We will process
// `PARALLELISM` futures at the same time, but with no specified
// order.
let all_done =
    futures::stream::iter(iterator_of_futures.map(Ok))
    .buffer_unordered(PARALLELISM);

// Everything after here is just using the stream in
// some manner, not directly related

let mut successes = Vec::with_capacity(LIMIT);
let mut failures = Vec::with_capacity(LIMIT);

// Pull values off the stream, dividing them into success and
// failure buckets.
let mut all_done = all_done.into_future();
loop {
    match core.run(all_done) {
        Ok((None, _)) => break,
        Ok((Some(v), next_all_done)) => {
            successes.push(v);
            all_done = next_all_done.into_future();
        }
        Err((v, next_all_done)) => {
            failures.push(v);
            all_done = next_all_done.into_future();
        }
    }
}

这是在一段示例代码中使用的,因此事件循环(core)是明确驱动的。观察程序使用的文件句柄数量表明它有上限。此外,在添加此瓶颈之前,我们很快就用完了允许的文件句柄,而之后我们没有。