Skip to content

Commit 54371c2

Browse files
authored
Merge pull request #510 from stjepang/fix-spawn-blocking
Improve thread startup/shutdown algorithm in spawn_blocking
2 parents 9ad0cf9 + 1a50ffd commit 54371c2

File tree

1 file changed

+19
-8
lines changed

1 file changed

+19
-8
lines changed

src/task/spawn_blocking.rs

+19-8
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use crossbeam_channel::{unbounded, Receiver, Sender};
66
use once_cell::sync::Lazy;
77

88
use crate::task::{JoinHandle, Task};
9-
use crate::utils::{abort_on_panic, random};
9+
use crate::utils::abort_on_panic;
1010

1111
/// Spawns a blocking task.
1212
///
@@ -68,16 +68,13 @@ static POOL: Lazy<Pool> = Lazy::new(|| {
6868

6969
fn start_thread() {
7070
SLEEPING.fetch_add(1, Ordering::SeqCst);
71-
72-
// Generate a random duration of time between 1 second and 10 seconds. If the thread doesn't
73-
// receive the next task in this duration of time, it will stop running.
74-
let timeout = Duration::from_millis(1000 + u64::from(random(9_000)));
71+
let timeout = Duration::from_secs(1);
7572

7673
thread::Builder::new()
7774
.name("async-std/blocking".to_string())
7875
.spawn(move || {
7976
loop {
80-
let task = match POOL.receiver.recv_timeout(timeout) {
77+
let mut task = match POOL.receiver.recv_timeout(timeout) {
8178
Ok(task) => task,
8279
Err(_) => {
8380
// Check whether this is the last sleeping thread.
@@ -100,8 +97,22 @@ fn start_thread() {
10097
start_thread();
10198
}
10299

103-
// Run the task.
104-
abort_on_panic(|| task.run());
100+
loop {
101+
// Run the task.
102+
abort_on_panic(|| task.run());
103+
104+
// Try taking another task if there are any available.
105+
task = match POOL.receiver.try_recv() {
106+
Ok(task) => task,
107+
Err(_) => break,
108+
};
109+
}
110+
111+
// If there is at least one sleeping thread, stop this thread instead of putting it
112+
// to sleep.
113+
if SLEEPING.load(Ordering::SeqCst) > 0 {
114+
return;
115+
}
105116

106117
SLEEPING.fetch_add(1, Ordering::SeqCst);
107118
}

0 commit comments

Comments
 (0)