Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Lib.rs Example and Async Block Callout (#1203)
Add a more complete example to lib.rs, and callout that examples and snippets in the crate use an async block.
- Loading branch information
Showing
7 changed files
with
194 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
[package] | ||
name = "futures-example-functional" | ||
edition = "2018" | ||
version = "0.3.0" | ||
authors = ["Alex Crichton <alex@alexcrichton.com>"] | ||
license = "MIT OR Apache-2.0" | ||
readme = "../README.md" | ||
keywords = ["futures", "async", "future"] | ||
repository = "https://github.com/rust-lang-nursery/futures-rs" | ||
homepage = "https://rust-lang-nursery.github.io/futures-rs" | ||
documentation = "https://docs.rs/futures/0.3.0" | ||
description = """ | ||
An implementation of futures and streams featuring zero allocations, | ||
composability, and iterator-like interfaces. | ||
""" | ||
categories = ["asynchronous"] | ||
|
||
[dependencies] | ||
futures = { path = "../../", version = "0.3.0", features = ["thread-pool"] } |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
use futures::channel::mpsc; | ||
use futures::executor; //standard executors to provide a context for futures and streams | ||
use futures::executor::ThreadPool; | ||
use futures::StreamExt; | ||
|
||
fn main() { | ||
let pool = ThreadPool::new().expect("Failed to build pool"); | ||
let (tx, rx) = mpsc::unbounded::<i32>(); | ||
|
||
// Create a future by an async block, where async is responsible for an | ||
// implementation of Future. At this point no executor has been provided | ||
// to this future, so it will not be running. | ||
let fut_values = async { | ||
// Create another async block, again where the Future implementation | ||
// is generated by async. Since this is inside of a parent async block, | ||
// it will be provided with the executor of the parent block when the parent | ||
// block is executed. | ||
// | ||
// This executor chaining is done by Future::poll whose second argument | ||
// is a std::task::Context. This represents our executor, and the Future | ||
// implemented by this async block can be polled using the parent async | ||
// block's executor. | ||
let fut_tx_result = async move { | ||
(0..100).for_each(|v| { | ||
tx.unbounded_send(v).expect("Failed to send"); | ||
}) | ||
}; | ||
|
||
// Use the provided thread pool to spawn the generated future | ||
// responsible for transmission | ||
pool.spawn_ok(fut_tx_result); | ||
|
||
let fut_values = rx | ||
.map(|v| v * 2) | ||
.collect(); | ||
|
||
// Use the executor provided to this async block to wait for the | ||
// future to complete. | ||
fut_values.await | ||
}; | ||
|
||
// Actually execute the above future, which will invoke Future::poll and | ||
// subsequenty chain appropriate Future::poll and methods needing executors | ||
// to drive all futures. Eventually fut_values will be driven to completion. | ||
let values: Vec<i32> = executor::block_on(fut_values); | ||
|
||
println!("Values={:?}", values); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
[package] | ||
name = "futures-example-imperative" | ||
edition = "2018" | ||
version = "0.3.0" | ||
authors = ["Alex Crichton <alex@alexcrichton.com>"] | ||
license = "MIT OR Apache-2.0" | ||
readme = "../README.md" | ||
keywords = ["futures", "async", "future"] | ||
repository = "https://github.com/rust-lang-nursery/futures-rs" | ||
homepage = "https://rust-lang-nursery.github.io/futures-rs" | ||
documentation = "https://docs.rs/futures/0.3.0" | ||
description = """ | ||
An implementation of futures and streams featuring zero allocations, | ||
composability, and iterator-like interfaces. | ||
""" | ||
categories = ["asynchronous"] | ||
|
||
[dependencies] | ||
futures = { path = "../../", version = "0.3.0", features = ["thread-pool"] } |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
use futures::channel::mpsc; | ||
use futures::executor; //standard executors to provide a context for futures and streams | ||
use futures::executor::ThreadPool; | ||
use futures::StreamExt; | ||
|
||
fn main() { | ||
let pool = ThreadPool::new().expect("Failed to build pool"); | ||
let (tx, mut rx) = mpsc::unbounded::<i32>(); | ||
|
||
// Create a future by an async block, where async is responsible for generating | ||
// an implementation of Future. At this point no executor has been provided | ||
// to this future, so it will not be running. | ||
let fut_values = async { | ||
// Create another async block, again where Future is implemented by | ||
// async. Since this is inside of a parent async block, it will be | ||
// provided with the executor of the parent block when the parent | ||
// block is executed. | ||
// | ||
// This executor chaining is done by Future::poll whose second argument | ||
// is a std::task::Context. This represents our executor, and the Future | ||
// implemented by this async block can be polled using the parent async | ||
// block's executor. | ||
let fut_tx_result = async move { | ||
(0..100).for_each(|v| { | ||
tx.unbounded_send(v).expect("Failed to send"); | ||
}) | ||
}; | ||
|
||
// Use the provided thread pool to spawn the transmission | ||
pool.spawn_ok(fut_tx_result); | ||
|
||
let mut pending = vec![]; | ||
// Use the provided executor to wait for the next value | ||
// of the stream to be available. | ||
while let Some(v) = rx.next().await { | ||
pending.push(v * 2); | ||
}; | ||
|
||
pending | ||
}; | ||
|
||
// Actually execute the above future, which will invoke Future::poll and | ||
// subsequenty chain appropriate Future::poll and methods needing executors | ||
// to drive all futures. Eventually fut_values will be driven to completion. | ||
let values: Vec<i32> = executor::block_on(fut_values); | ||
|
||
println!("Values={:?}", values); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters