Skip to content

Commit 8e14e82

Browse files
committed
---
yaml --- r: 73231 b: refs/heads/dist-snap c: 1789174 h: refs/heads/master i: 73229: d233531 73227: d213ba5 73223: 7b13fec 73215: 9e7beb4 v: v3
1 parent 8d2f4b1 commit 8e14e82

31 files changed

+877
-507
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
88
refs/heads/try2: 147ecfdd8221e4a4d4e090486829a06da1e0ca3c
99
refs/heads/incoming: b50030718cf28f2a5a81857a26b57442734fe854
10-
refs/heads/dist-snap: 9b6b0e1e646b42de7205a21bf73e5c4c2b203a6b
10+
refs/heads/dist-snap: 1789174541d36bad270b3e27584db53516c93912
1111
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
1212
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503
1313
refs/heads/try3: 9387340aab40a73e8424c48fd42f0c521a4875c0

branches/dist-snap/doc/tutorial-tasks.md

Lines changed: 60 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -43,22 +43,24 @@ in the core and standard libraries, which are still under development
4343
and do not always present a consistent or complete interface.
4444

4545
For your reference, these are the standard modules involved in Rust
46-
concurrency at this writing.
46+
concurrency at this writing:
4747

48-
* [`core::task`] - All code relating to tasks and task scheduling
49-
* [`core::comm`] - The message passing interface
50-
* [`core::pipes`] - The underlying messaging infrastructure
51-
* [`std::comm`] - Additional messaging types based on `core::pipes`
52-
* [`std::sync`] - More exotic synchronization tools, including locks
48+
* [`core::task`] - All code relating to tasks and task scheduling,
49+
* [`core::comm`] - The message passing interface,
50+
* [`core::pipes`] - The underlying messaging infrastructure,
51+
* [`std::comm`] - Additional messaging types based on `core::pipes`,
52+
* [`std::sync`] - More exotic synchronization tools, including locks,
5353
* [`std::arc`] - The ARC (atomically reference counted) type,
54-
for safely sharing immutable data
54+
for safely sharing immutable data,
55+
* [`std::future`] - A type representing values that may be computed concurrently and retrieved at a later time.
5556

5657
[`core::task`]: core/task.html
5758
[`core::comm`]: core/comm.html
5859
[`core::pipes`]: core/pipes.html
5960
[`std::comm`]: std/comm.html
6061
[`std::sync`]: std/sync.html
6162
[`std::arc`]: std/arc.html
63+
[`std::future`]: std/future.html
6264

6365
# Basics
6466

@@ -70,7 +72,7 @@ closure in the new task.
7072

7173
~~~~
7274
# use core::io::println;
73-
use core::task::spawn;
75+
# use core::task::spawn;
7476
7577
// Print something profound in a different task using a named function
7678
fn print_message() { println("I am running in a different task!"); }
@@ -145,8 +147,8 @@ endpoint. Consider the following example of calculating two results
145147
concurrently:
146148

147149
~~~~
148-
use core::task::spawn;
149-
use core::comm::{stream, Port, Chan};
150+
# use core::task::spawn;
151+
# use core::comm::{stream, Port, Chan};
150152
151153
let (port, chan): (Port<int>, Chan<int>) = stream();
152154
@@ -233,7 +235,7 @@ Instead we can use a `SharedChan`, a type that allows a single
233235

234236
~~~
235237
# use core::task::spawn;
236-
use core::comm::{stream, SharedChan};
238+
# use core::comm::{stream, SharedChan};
237239
238240
let (port, chan) = stream();
239241
let chan = SharedChan::new(chan);
@@ -282,6 +284,51 @@ let result = ports.foldl(0, |accum, port| *accum + port.recv() );
282284
# fn some_expensive_computation(_i: uint) -> int { 42 }
283285
~~~
284286

287+
## Futures
288+
With `std::future`, rust has a mechanism for requesting a computation and getting the result
289+
later.
290+
291+
The basic example below illustrates this.
292+
~~~
293+
# fn make_a_sandwich() {};
294+
fn fib(n: uint) -> uint {
295+
// lengthy computation returning an uint
296+
12586269025
297+
}
298+
299+
let mut delayed_fib = std::future::spawn (|| fib(50) );
300+
make_a_sandwich();
301+
println(fmt!("fib(50) = %?", delayed_fib.get()))
302+
~~~
303+
304+
The call to `future::spawn` returns immediately a `future` object regardless of how long it
305+
takes to run `fib(50)`. You can then make yourself a sandwich while the computation of `fib` is
306+
running. The result of the execution of the method is obtained by calling `get` on the future.
307+
This call will block until the value is available (*i.e.* the computation is complete). Note that
308+
the future needs to be mutable so that it can save the result for next time `get` is called.
309+
310+
Here is another example showing how futures allow you to background computations. The workload will
311+
be distributed on the available cores.
312+
~~~
313+
fn partial_sum(start: uint) -> f64 {
314+
let mut local_sum = 0f64;
315+
for uint::range(start*100000, (start+1)*100000) |num| {
316+
local_sum += (num as f64 + 1.0).pow(-2.0);
317+
}
318+
local_sum
319+
}
320+
321+
fn main() {
322+
let mut futures = vec::from_fn(1000, |ind| do std::future::spawn { partial_sum(ind) });
323+
324+
let mut final_res = 0f64;
325+
for futures.each_mut |ft| {
326+
final_res += ft.get();
327+
}
328+
println(fmt!("π^2/6 is not far from : %?", final_res));
329+
}
330+
~~~
331+
285332
# Handling task failure
286333

287334
Rust has a built-in mechanism for raising exceptions. The `fail!()` macro
@@ -363,8 +410,8 @@ either task fails, it kills the other one.
363410
~~~
364411
# fn sleep_forever() { loop { task::yield() } }
365412
# do task::try {
366-
do task::spawn {
367-
do task::spawn {
413+
do spawn {
414+
do spawn {
368415
fail!(); // All three tasks will fail.
369416
}
370417
sleep_forever(); // Will get woken up by force, then fail

branches/dist-snap/src/libcore/bool.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,10 @@ pub fn is_false(v: bool) -> bool { !v }
4949
/// Parse logic value from `s`
5050
impl FromStr for bool {
5151
fn from_str(s: &str) -> Option<bool> {
52-
if s == "true" {
53-
Some(true)
54-
} else if s == "false" {
55-
Some(false)
56-
} else {
57-
None
52+
match s {
53+
"true" => Some(true),
54+
"false" => Some(false),
55+
_ => None,
5856
}
5957
}
6058
}

0 commit comments

Comments
 (0)