mirror of
https://github.com/rust-lang-nursery/rust-cookbook
synced 2024-11-22 03:23:05 +00:00
Adds simple single producer, single consumer crossbeam channel example. (#551)
This commit is contained in:
parent
d7c291151f
commit
084f51cff9
4 changed files with 46 additions and 0 deletions
|
@ -16,6 +16,7 @@ cc = "1.0"
|
||||||
chrono = "0.4"
|
chrono = "0.4"
|
||||||
clap = "2.29"
|
clap = "2.29"
|
||||||
crossbeam = "0.5"
|
crossbeam = "0.5"
|
||||||
|
crossbeam-channel = "0.3.9"
|
||||||
csv = "1.0"
|
csv = "1.0"
|
||||||
data-encoding = "2.1.0"
|
data-encoding = "2.1.0"
|
||||||
env_logger = "0.5"
|
env_logger = "0.5"
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
| Recipe | Crates | Categories |
|
| Recipe | Crates | Categories |
|
||||||
|--------|--------|------------|
|
|--------|--------|------------|
|
||||||
| [Spawn a short-lived thread][ex-crossbeam-spawn] | [![crossbeam-badge]][crossbeam] | [![cat-concurrency-badge]][cat-concurrency] |
|
| [Spawn a short-lived thread][ex-crossbeam-spawn] | [![crossbeam-badge]][crossbeam] | [![cat-concurrency-badge]][cat-concurrency] |
|
||||||
|
| [Pass data between two threads][ex-crossbeam-spsc] | [![crossbeam-badge]][crossbeam] | [![cat-concurrency-badge]][cat-concurrency] |
|
||||||
| [Maintain global mutable state][ex-global-mut-state] | [![lazy_static-badge]][lazy_static] | [![cat-rust-patterns-badge]][cat-rust-patterns] |
|
| [Maintain global mutable state][ex-global-mut-state] | [![lazy_static-badge]][lazy_static] | [![cat-rust-patterns-badge]][cat-rust-patterns] |
|
||||||
| [Calculate SHA1 sum of *.iso files concurrently][ex-threadpool-walk] | [![threadpool-badge]][threadpool] [![walkdir-badge]][walkdir] [![num_cpus-badge]][num_cpus] [![ring-badge]][ring] | [![cat-concurrency-badge]][cat-concurrency][![cat-filesystem-badge]][cat-filesystem] |
|
| [Calculate SHA1 sum of *.iso files concurrently][ex-threadpool-walk] | [![threadpool-badge]][threadpool] [![walkdir-badge]][walkdir] [![num_cpus-badge]][num_cpus] [![ring-badge]][ring] | [![cat-concurrency-badge]][cat-concurrency][![cat-filesystem-badge]][cat-filesystem] |
|
||||||
| [Draw fractal dispatching work to a thread pool][ex-threadpool-fractal] | [![threadpool-badge]][threadpool] [![num-badge]][num] [![num_cpus-badge]][num_cpus] [![image-badge]][image] | [![cat-concurrency-badge]][cat-concurrency][![cat-science-badge]][cat-science][![cat-rendering-badge]][cat-rendering] |
|
| [Draw fractal dispatching work to a thread pool][ex-threadpool-fractal] | [![threadpool-badge]][threadpool] [![num-badge]][num] [![num_cpus-badge]][num_cpus] [![image-badge]][image] | [![cat-concurrency-badge]][cat-concurrency][![cat-science-badge]][cat-science][![cat-rendering-badge]][cat-rendering] |
|
||||||
|
@ -15,6 +16,7 @@
|
||||||
|
|
||||||
|
|
||||||
[ex-crossbeam-spawn]: concurrency/threads.html#spawn-a-short-lived-thread
|
[ex-crossbeam-spawn]: concurrency/threads.html#spawn-a-short-lived-thread
|
||||||
|
[ex-crossbeam-spsc]: concurrency/threads.html#pass-data-between-two-threads
|
||||||
[ex-global-mut-state]: concurrency/threads.html#maintain-global-mutable-state
|
[ex-global-mut-state]: concurrency/threads.html#maintain-global-mutable-state
|
||||||
[ex-threadpool-walk]: concurrency/threads.html#calculate-sha1-sum-of-iso-files-concurrently
|
[ex-threadpool-walk]: concurrency/threads.html#calculate-sha1-sum-of-iso-files-concurrently
|
||||||
[ex-threadpool-fractal]: concurrency/threads.html#draw-fractal-dispatching-work-to-a-thread-pool
|
[ex-threadpool-fractal]: concurrency/threads.html#draw-fractal-dispatching-work-to-a-thread-pool
|
||||||
|
|
41
src/concurrency/thread/crossbeam-spsc.md
Normal file
41
src/concurrency/thread/crossbeam-spsc.md
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
# Pass data between two threads
|
||||||
|
|
||||||
|
[![crossbeam-badge]][crossbeam] [![cat-concurrency-badge]][cat-concurrency]
|
||||||
|
|
||||||
|
This example demonstrates the use of [crossbeam-channel] in a single producer, single
|
||||||
|
consumer (SPSC) setting. We build off the [ex-crossbeam-spawn] example by using
|
||||||
|
[`crossbeam::scope`] and [`Scope::spawn`] to manage the producer thread. Data is
|
||||||
|
exchanged between the two threads using a [`crossbeam_channel::unbounded`]
|
||||||
|
channel, meaning there is no limit to the number of storeable messages. The
|
||||||
|
producer thread sleeps for half a second in between messages.
|
||||||
|
|
||||||
|
```rust
|
||||||
|
extern crate crossbeam;
|
||||||
|
extern crate crossbeam_channel;
|
||||||
|
|
||||||
|
use std::{thread, time};
|
||||||
|
use crossbeam_channel::unbounded;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let (snd, rcv) = unbounded();
|
||||||
|
let n_msgs = 5;
|
||||||
|
crossbeam::scope(|s| {
|
||||||
|
s.spawn(|_| {
|
||||||
|
for i in 0..n_msgs {
|
||||||
|
snd.send(i).unwrap();
|
||||||
|
thread::sleep(time::Duration::from_millis(100));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}).unwrap();
|
||||||
|
for _ in 0..n_msgs {
|
||||||
|
let msg = rcv.recv().unwrap();
|
||||||
|
println!("Received {}", msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
[crossbeam-channel]: https://docs.rs/crate/crossbeam-channel/
|
||||||
|
[ex-crossbeam-spawn]: concurrency/threads.html#spawn-a-short-lived-thread
|
||||||
|
[`crossbeam::scope`]: https://docs.rs/crossbeam/*/crossbeam/fn.scope.html
|
||||||
|
[`Scope::spawn`]: https://docs.rs/crossbeam/*/crossbeam/thread/struct.Scope.html#method.spawn
|
||||||
|
[`crossbeam_channel::unbounded`]: https://docs.rs/crossbeam-channel/*/crossbeam_channel/fn.unbounded.html
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
{{#include thread/crossbeam-spawn.md}}
|
{{#include thread/crossbeam-spawn.md}}
|
||||||
|
|
||||||
|
{{#include thread/crossbeam-spsc.md}}
|
||||||
|
|
||||||
{{#include thread/global-mut-state.md}}
|
{{#include thread/global-mut-state.md}}
|
||||||
|
|
||||||
{{#include thread/threadpool-walk.md}}
|
{{#include thread/threadpool-walk.md}}
|
||||||
|
|
Loading…
Reference in a new issue